我在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得到了上面的结果。但我想要简单的方法。是否有美丽而简单的方法来获得结果?
答案 0 :(得分:1)
>>> 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.defaultdict
和collections.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]}
细节:
collections.Counter
对象和整数(用于全局计数)答案 2 :(得分:0)