2016-12-03 4 views
0

Ich sortierte Listen innerhalb der Liste auf Python. aber ich muss auch Listenelemente zählen. folgende Liste:Wie zählen Liste Elemente in der Liste auf Python

fruit = [ 
    ['Apple', 'S+'], ['Apple', 'S+'], ['Apple', 'B+'], 
    ['Grape', 'B+'], ['Grape', 'C+'] 
] 

Ergebnis:

{'Apple':{'total':3, 'S+':2, 'B+':1}, 'Grape':{'total':2, 'B+':1, 'C+':1}} 

ich oben bekam führen durch mehr für und während. aber ich will einfachen Weg. Gibt es einen schönen und einfachen Weg, das Ergebnis über das Ding zu bringen?

Antwort

0

Etwas nähert sich, was Sie wollen, mit collections.defaultdict und collections.Counter.

Ich habe versucht, es so pythonisch wie möglich zu machen.

import collections 

fruit = [ 
    ['Apple', 'S+'], ['Apple', 'S+'], ['Apple', 'B+'], 
    ['Grape', 'B+'], ['Grape', 'C+'] 
] 


d = collections.defaultdict(lambda : [collections.Counter(),0]) 

for k,v in fruit: 
    d[k][0][v]+=1 
    d[k][1]+=1 

print(dict(d)) # convert to dict for readability when printing 

Ergebnis:

{'Grape': [Counter({'B+': 1, 'C+': 1}), 2], 'Apple': [Counter({'S+': 2, 'B+': 1}), 3]} 

Details:

  • ein Wörterbuch erstellen, die standardmäßig eine 2-Element-Liste erstellt, wenn der Schlüssel nicht vorhanden ist. Diese Elementliste besteht aus einem collections.Counter Objekt und einer Ganzzahl (für die globale Zählung)
  • Schleife auf den "Tupel", und zählen Elemente und insgesamt.
0
unique, counts = numpy.unique(fruits, return_counts=True) 

return_counts wurde unique in numpy hinzugefügt 1.9.0

1

itertools.groupby Spaß.

>>> result = {} 
>>> for k, v in groupby(fruit,lambda x:x[0]): 
...  value = list(v) 
...  result[k] = {'total':len(value)} 
...  for i,j in groupby(value, lambda x:x[1]): 
...   result[k].update({i:len(list(j))}) 

Ausgang:

{'Grape': {'total': 2, 'C+': 1, 'B+': 1}, 'Apple': {'total': 3, 'S+': 2, 'B+': 1}} 

N. B.

Obwohl hier nicht benötigt, ist es immer ratsam, die Sammlung zu sortieren, bevor groupby angewendet wird. Für dieses Beispiel:

fruit = sorted(fruit, key= lambda x:(x[0],x[1])) 
Verwandte Themen