2016-12-03 2 views
0

Я отсортировал списки в списке на python. но мне нужно также подсчитать элементы списка. Следующий список:Как подсчитать элементы списка в списке на python

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

результат:

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

Я получил выше результат через несколько для и время. но я хочу простой способ. Есть ли прекрасный и простой способ получить результат выше?

ответ

0

Что-то приближается к тому, что вы хотите, используя collections.defaultdict и collections.Counter.

Я попытался сделать его максимально возможным как питоном.

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 

результат:

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

детали:

  • создать словарь, который по умолчанию создает список, состоящий из 2-элемента, когда ключ не существует. Этот список элементов состоит из объекта collections.Counter и целого числа (для глобального подсчета)
  • цикл на «кортежах», а также элементы счета и итоговые значения.
0
unique, counts = numpy.unique(fruits, return_counts=True) 

return_counts был добавлен в unique в NumPy 1.9.0

1

itertools.groupby удовольствие.

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

Выход:

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

нотабене

Хотя, не нужно здесь, всегда разумно сортировать коллекцию перед применением groupby. В этом примере:

fruit = sorted(fruit, key= lambda x:(x[0],x[1])) 
Смежные вопросы