组列表

问题描述:

我怎么可以组字典的类似键在列表组列表

如果我有

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)将其转换成香草字典。

+0

哇谢谢这个工作 –

您的数据模型非常冗余。您可以使用dicttype作为键和数量列表作为值。

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