queryset以使用公共字段作为键进行dict

时间:2013-03-25 02:48:05

标签: python django

给出这样的查询集:

[<'item', 'category1'>, <'item2', 'category1'>, <'item3', 'category2'>]

什么是将这个“压缩”到一个字典的Pythonic方法,其中常见的类别是键,值是列表? e.g。

{ category1: [item, item2], category2: [item3] }

2 个答案:

答案 0 :(得分:1)

使用defaultdict。如果字典中不存在键,则返回默认构造的项。在它下面返回一个空列表,因此可以附加每个项目而无需对不存在的密钥进行特殊处理。

from collections import defaultdict
D = defaultdict(list)
data = [('item', 'category1'), ('item2', 'category1'), ('item3', 'category2')]

for item,category in data:
    D[category].append(item)
print(D)

输出:

defaultdict(<class 'list'>, {'category2': ['item3'], 'category1': ['item', 'item2']})

答案 1 :(得分:0)

我确信他们的方法比较干净,但以下情况肯定会有效:

qs = [('item', 'category1'), ('item2', 'category1'), ('item3', 'category2')]
for item, cat in qs:
if cat not in cat_dict:
    cat_dict[cat] = []
cat_dict[cat].append(item)