组列表
问题描述:
我怎么可以组字典的类似键在列表组列表
如果我有
data = [{'quantity': 2, 'type': 'Vip'}, {'quantity': 23, 'type': 'Vip'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}]
,我希望它这样
res = {'Regular': [{'quantity': 2, 'type': 'Regular'},{'quantity': 2, 'type': 'Regular'},{'quantity': 2, 'type': 'Regular'}], 'Vip': [{'quantity': 23, 'type': 'Vip'},{'quantity': 23, 'type': 'Vip'}]}
这里输出是我尝试过的代码,但它给了我两倍的密钥可能是因为循环
res = defaultdict(list)
for i in data:
if len(res) >= 1:
for q in res:
if q == i['type']:
res[q].append(i)
break
else:
res[i['type']].append(i)
break
res[i['type']].append(i)
答
我觉得你不完全明白defaultdict
的想法。如果在查找时不存在,则defaultdict
将产生新的对象。
所以,你可以简单地使用:
from collections import defaultdict
res = defaultdict(list)
for i in data:
res[i['type']].append(i)
这将产生:
>>> pprint(res)
defaultdict(<class 'list'>,
{'Regular': [{'quantity': 2, 'type': 'Regular'},
{'quantity': 2, 'type': 'Regular'},
{'quantity': 2, 'type': 'Regular'},
{'quantity': 2, 'type': 'Regular'}],
'Vip': [{'quantity': 2, 'type': 'Vip'},
{'quantity': 23, 'type': 'Vip'}]})
(pprint
是漂亮打印,但不改变内容)。
请注意,我们在这里复制参考到字典到新列表,所以我们不创建一个新的字典。此外,结果是defaultdict
。我们可以用dict(res)
将其转换成香草字典。
答
您的数据模型非常冗余。您可以使用dict
和type
作为键和数量列表作为值。
data = [{'quantity': 2, 'type': 'Vip'}, {'quantity': 23, 'type': 'Vip'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}, {'quantity': 2, 'type': 'Regular'}]
res = {}
for d in data:
res.setdefault(d['type'], []).append(d['quantity'])
print(res)
# {'Vip': [2, 23], 'Regular': [2, 2, 2, 2]}
输出要短得多,但你并没有丢失任何信息。
如果你只在总量有兴趣,你可以使用一个Counter
:
from collections import Counter
count = Counter()
for d in data:
count[d['type']] += d['quantity']
print(count)
# Counter({'Vip': 25, 'Regular': 8})
~
哇谢谢这个工作 –