如何计算python列表中的列表元素

时间:2016-12-03 09:15:48

标签: 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}}

我通过几个for和while得到了上面的结果。但我想要简单的方法。是否有美丽而简单的方法来获得结果?

3 个答案:

答案 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}}

N.B。

虽然这里不需要,但在应用groupby之前对集合进行排序总是明智的。对于这个例子:

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

答案 1 :(得分:0)

使用collections.defaultdictcollections.Counter来接近您想要的东西。

我尽量让它成为pythonic。

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

细节:

  • 创建一个字典,默认情况下,当key不存在时,创建一个2元素列表。此元素列表由collections.Counter对象和整数(用于全局计数)
  • 组成
  • 循环“元组”,并计算元素和总数。

答案 2 :(得分:0)

unique, counts = numpy.unique(fruits, return_counts=True)
numpy 1.9.0

中将{p> return_counts添加到unique