Подсчитать каждый экземпляр элемента в списке списков и суммировать их - PullRequest
0 голосов
/ 23 февраля 2020

В Python 3.x у меня есть список списков:

[['a','b','c'], ['a', 'c'], ['c', 'd'] ]

Я видел этот ответ , но он применим только к одному списку. Как бы я сделал это для списка списков? Моим желаемым выводом будет отсортированный список (или сортируемый список) частоты определенного элемента в списке.

Что-то вроде:

{a: 2, b: 1, c: 3, d: 1 }

Ответы [ 6 ]

3 голосов
/ 23 февраля 2020

Вы можете использовать itertools.chain(*l) в качестве входа для Counter.

>>> l= [['a','b','c'], ['a', 'c'], ['c', 'd'] ]
>>> Counter(itertools.chain(*l))
Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})
2 голосов
/ 23 февраля 2020

Это можно решить с помощью Счетчик . Счетчик создает словарь подсчета элементов в списках.

L = [['a','b','c'], ['a', 'c'], ['c', 'd'] ]
>>> from collections import Counter
>>> d = Counter()
>>> for sub in L:
    d.update(sub)


>>> d
Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})
1 голос
/ 23 февраля 2020

Вы можете использовать Counter из collections, чтобы сделать это очень эффективно:


In [161]: from collections import Counter
     ...: 
     ...: count = Counter()
     ...: 
     ...: lists = [['a','b','c'], ['a', 'c'], ['c', 'd']]
     ...: 
     ...: for sublist in lists:
     ...:     count += Counter(sublist)
     ...: 
     ...: print(count)
Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})

Это "возможность в одну строку" с использованием встроенного python sum:

In [163]: from collections import Counter
     ...: lists = [['a','b','c'], ['a', 'c'], ['c', 'd']]
     ...: 
     ...: count = sum(map(Counter, lists), start=Counter())
     ...: 
     ...: print(count)
Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})
0 голосов
/ 24 февраля 2020

Вы можете сгладить свой список и применить collections.Counter:

from collections import Counter

l = [['a','b','c'], ['a', 'c'], ['c', 'd'] ]
Counter((e for i in l for e in i))
0 голосов
/ 23 февраля 2020

Вы можете сделать это в каждом подсписке:

dict={} 
for sublist in list:
    for item in sublist:
        if item in dict.keys():
            dict[item] +=1
        else:
            dict[item] =1
0 голосов
/ 23 февраля 2020

Вы можете сгладить список и использовать Counter. Если ваш список произвольно вложен.

from collections import Counter
def flatten(lst):
    if not isinstance(lst,list):
        return [lst]
    else:
        return [j for i in lst for j in flatten(i)]

print(Counter(flatten([['a','b','c'], ['a', 'c'], ['c', 'd'] ])))
#Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...