字典python组列表

时间:2017-10-20 08:07:23

标签: python python-3.x list dictionary

如何在列表中对字典的类似键进行分组

如果我有

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)

2 个答案:

答案 0 :(得分:4)

我认为你不完全理解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)将其转换为 vanilla 字典。

答案 1 :(得分:2)

您的数据模型非常冗余。您可以使用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})
~