Подсчет появления строк в списке списков - PullRequest
1 голос
/ 19 июня 2019

Я хочу подсчитать, сколько раз строка встречалась в списке, который находится в другом списке, и сохранять его в списке словаря, где каждый словарь имеет счетчик списка.Например,

list = [['Sam','John','Alex','Sam','Alex'],['Max','Sam','Max']...]

и я хочу, чтобы мой список словарей был похож на:

count_list = [{'Sam':2,'Alex':2,'John':1}, {'Max':2, 'Sam':1}..] 

Я перебираю каждый список для подсчета количества повторений каждой строки и добавления каждого результатадиктоватьНо я получаю каждый раз разные результаты, а не правильные значения.

count_list = []
for l in list :
    d = {}
    for str in l:
        if str not in d:
            d[str] = l.count(str)
            count_list.append(d)

Любая помощь будет полезна. Спасибо.

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Было бы проще использовать collections.Counter() здесь:

>>> from collections import Counter
>>> lst = [["Sam", "John", "Alex", "Sam", "Alex"], ["Max", "Sam", "Max"]]
>>> list(map(Counter, lst))
[Counter({'Sam': 2, 'Alex': 2, 'John': 1}), Counter({'Max': 2, 'Sam': 1})]

Вы также можете использовать понимание списка вместо использования map(), если это таклегче понять:

>>> [Counter(l) for l in lst]
[Counter({'Sam': 2, 'Alex': 2, 'John': 1}), Counter({'Max': 2, 'Sam': 1})]

Примечание: Counter является подклассом dict, поэтому вы можете обращаться с ними как с обычными словарями.

Вы всегда можете привести к dict(), если хотите, также:

>>> [dict(Counter(l)) for l in lst]
[{'Sam': 2, 'John': 1, 'Alex': 2}, {'Max': 2, 'Sam': 1}]

Вы также не должны использовать list в качестве имени переменной, так как оно затеняетвстроенная функция list().

0 голосов
/ 19 июня 2019

В настоящее время вы делаете следующее:

count_list = []
for l in list :
    d = {}
    for str in l:
        if str not in d:
            d[str] = l.count(str)
            count_list.append(d)

Обратите внимание, что вы добавляете словарь для каждой строки в подсписках, а не один словарь для подсписка.

Выполнениеследующее должно решить проблему:

count_list = []
for l in list :
    d = {}
    for str in l:
        if str not in d:
            d[str] = l.count(str)
    count_list.append(d)
...