In Python 3.x habe ich eine Liste von Listen:

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

Ich habe diese Antwort gesehen , aber es gilt nur für eine einzelne Liste. Wie würde ich das für eine Liste von Listen tun? Meine gewünschte Ausgabe wäre eine sortierte Liste (oder eine sortierbare Liste) der Häufigkeit eines bestimmten Elements in einer Liste.

Etwas wie:

{a: 2, b: 1, c: 3, d: 1 }
0
Jeff 23 Feb. 2020 im 23:28

6 Antworten

Beste Antwort

Dies kann mithilfe des Counter behoben werden. Counter erstellt ein Wörterbuch mit der Anzahl der Elemente in den Listen.

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})
2
Chris Charley 23 Feb. 2020 im 20:35

Sie können Ihre Liste reduzieren und collections.Counter anwenden:

from collections import Counter

l = [['a','b','c'], ['a', 'c'], ['c', 'd'] ]
Counter((e for i in l for e in i))
0
kederrac 23 Feb. 2020 im 22:15

Sie können dies tun, indem Sie in jeder Unterliste jucken:

dict={} 
for sublist in list:
    for item in sublist:
        if item in dict.keys():
            dict[item] +=1
        else:
            dict[item] =1
0
Renaud 23 Feb. 2020 im 20:37

Sie können die Liste reduzieren und Counter verwenden. Wenn Ihre Liste willkürlich verschachtelt ist.

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})
0
Ch3steR 23 Feb. 2020 im 20:35

Sie können Counter von collections verwenden, um dies sehr effizient zu tun:


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})

Dies ist eine "einzeilige Tabelle" mit 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})
1
salt-die 23 Feb. 2020 im 20:34

Sie können itertools.chain(*l) als Eingabe für Counter verwenden.

>>> l= [['a','b','c'], ['a', 'c'], ['c', 'd'] ]
>>> Counter(itertools.chain(*l))
Counter({'c': 3, 'a': 2, 'b': 1, 'd': 1})
2
abc 23 Feb. 2020 im 20:39