我有以下列表:
itemlist=[('ItemA', '0', 'Type1'), ('ItemA', '0', 'Type2'),('ItemA', '0', 'Type1'), ('ItemB', '0', 'Type2'), ('ItemA', '1', 'Type2'), ('ItemB', '2', 'Type1'), ('ItemB', '1', 'Type3'), ('ItemB', '1', 'Type1'), ('ItemC', '1', 'Type4'), ('ItemD', '1', 'Type4')]
接下来,我按编号对项目进行分组,并计算数字:
from itertools import groupby
sortkeyfn_num = key = lambda s:s[0]
itemlist.sort(key=sortkeyfn_num)
result_name_dict = {}
for key,valuesiter in groupby(itemlist, key=sortkeyfn_num):
result_name_dict[key] = tuple(v[1] for v in valuesiter)
res = {}
for k in result_name_dict.keys():
for i in result_name_dict.values()[result_name_dict.keys().index(k)]:
res.setdefault(i, 0)
res[i] += 1
print k,'=', res
res.clear()
结果:
ItemB = {'1': 2, '0': 1, '2': 1}
ItemC = {'1': 1}
ItemA = {'1': 1, '0': 3}
ItemD = {'1': 1}
但是如何按编号和类型对项目进行分组,并在结果中计算类型? 结果必须是,例如:
ItemA 0: Type1 = 2
ItemA 0: Type2 = 1
ItemA 1: Type2 = 1
ItemB 0: Type2 = 1
ItemB 1: Type3 = 2
感谢。
答案 0 :(得分:1)
也许这个?
import collections
itemlist = [('ItemA', '0', 'Type1'), ('ItemA', '0', 'Type2'),('ItemA', '0', 'Type1'), ('ItemB', '0', 'Type2'), ('ItemA', '1', 'Type2'), ('ItemB', '2', 'Type1'), ('ItemB', '1', 'Type3'), ('ItemB', '1', 'Type1'), ('ItemC', '1', 'Type4'), ('ItemD', '1', 'Type4')]
data_dict = collections.defaultdict(int)
for attribute1, attribute2, attribute3 in itemlist:
data_dict[(attribute1, attribute2, attribute3)] += 1
for key, value in sorted(data_dict.items()):
attribute1, attribute2, attribute3 = key
print("{attribute1} {attribute2}: {attribute3} = {value}".format(**locals()))
答案 1 :(得分:0)
在这里使用collections.Counter
会更有效:
from collections import Counter
itemlist=[('ItemA', '0', 'Type1'), ('ItemA', '0', 'Type2'),('ItemA', '0', 'Type1'), ('ItemB', '0', 'Type2'), ('ItemA', '1', 'Type2'), ('ItemB', '2', 'Type1'), ('ItemB', '1', 'Type3'), ('ItemB', '1', 'Type1'), ('ItemC', '1', 'Type4'), ('ItemD', '1', 'Type4')]
for (a,b,c),d in sorted(Counter(itemlist).items()):
print "{} {}: {} = {}".format(a, b, c, d)
输出:
ItemA 0: Type1 = 2
ItemA 0: Type2 = 1
ItemA 1: Type2 = 1
ItemB 0: Type2 = 1
ItemB 1: Type1 = 1
ItemB 1: Type3 = 1
ItemB 2: Type1 = 1
ItemC 1: Type4 = 1
ItemD 1: Type4 = 1