[Python] Подсчет уникальных строк

Discussion in 'Python' started by Lector, 6 Aug 2019.

  1. Lector

    Lector New Member

    Joined:
    17 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    добрый день!
    Знакомлюсь с python. Необходимо подсчитать количество уникальных строк в файле.
    Если задаю руками список, то все ок.

    from collections import Counter
    text ="""
    Илья
    Марина
    Марина
    Марина
    """
    text = text.split('\n')
    count = Counter(text)
    print (count)

    Получаю:
    Counter({'Марина': 3, '': 2, 'Илья': 1})

    Как обработать построчно большой текстовый файл и вывести счетчик уникальных значений?
    Буду признателен!
     
  2. Lector

    Lector New Member

    Joined:
    17 Apr 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Выдает только первое значение списка...

    from collections import Counter
    import re

    list_of_lists = []
    with open(r"D:\Scripts\base.txt") as f:
    for line in f:
    inner_list = [elt.strip() for elt in line.split('\n')]
    list_of_lists.append(inner_list)

    count = Counter(inner_list)
    print (count)
     
  3. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Ты как-то немного усложнил реализацию. Все намного проще:

    Code:
    from collections import Counter
    
    counter = Counter()
    
    with open("base.txt") as file:
        for line in file:
            lineKey = line.replace('\n', '')
            counter[lineKey] += 1
    
    print(counter)
    
    Это такая, более императивная реализация того что тебе нужно. Если же хочешь пайтоновской красоты, то можно вот так:

    Code:
    from collections import Counter
    
    with open("base.txt") as file:
        counter = Counter(line[:-1] for line in file)
        print(counter)
     
    #3 herfleisch, 9 Aug 2019
    Last edited: 10 Aug 2019
    Kevin Shindel and 4Fun like this.
  4. xppert

    xppert New Member

    Joined:
    13 Aug 2019
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Для этих целей есть специальная базовая структура языка называется set:

    Code:
    >>> items = set([1, 2, 3, 1, 2, 2, 5])
    >>> print(items)
    {1, 2, 3, 5}
     
  5. Kevin Shindel

    Kevin Shindel Elder - Старейшина

    Joined:
    24 May 2015
    Messages:
    1,011
    Likes Received:
    1,192
    Reputations:
    62
    Только она возвращает уникальные значения, а челу нужно список совпадений.
     
    Triton_Mgn likes this.
  6. 4Fun

    4Fun Elder - Старейшина

    Joined:
    25 Jul 2018
    Messages:
    496
    Likes Received:
    709
    Reputations:
    11
    Вижу небольшую проблемку с избавлением от символа переноса строки. Поскольку Python имеет элегантный синтаксис, призванный убедить программистов писать читаемый код, я решил бы её так:
    Code:
    from collections import Counter
    
    with open("base.txt") as file:
        counter = Counter(file.read().splitlines())
        print(counter)
     
  7. DctrSchmidt

    DctrSchmidt New Member

    Joined:
    27 Jun 2019
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Code:
    from collections import Counter
    from pprint import pprint
    
    r = Counter([x.strip() for x in open('words.txt').readlines() if x.strip()])
    pprint(r)
    
     
  8. Hohol99

    Hohol99 Member

    Joined:
    7 Apr 2020
    Messages:
    61
    Likes Received:
    17
    Reputations:
    0
    Подойдет ли решение для больших файлов?
    При попытке обработать большие файлы вечно появляются проблемы, ни потоки, не деление на части не помогает, python не занимает больше 30% нагрузки на диск.
    Может быть эта задача не решаемая питоном? Все-таки не самый быстрый язык.