您好我正在构建一个字典,其中每个键都是一个客户名称,每个值都是每个客户购买的元组列表,如下所示:(产品,数量)。例如:
{'customer1': (('milk', 3), ('bread', 5), ('eggs', 2)),
'customer2': (('cheese', 2), ('cereal', 7))}
我根据SQL查询的结果填充字典。作为Python新手的Java程序员,有人可以建议采用“pythonic”方式吗?查询中的每一行都包含客户名称,产品,数量。
答案 0 :(得分:11)
首先,我使用列表而不是元组作为字典条目。主要区别在于列表是可变的,而元组则不是。
我认为defaultdict
对这个问题有好处:
from collections import defaultdict
customers = defaultdict(list)
您可以添加这样的条目(当然,在您的情况下,您可以循环执行此操作):
customers['customer1'].append(('milk', 3))
customers['customer1'].append(('bread', 5))
customers['customer2'].append(('cereal', 7))
结果是:
>>> print dict(customers)
{'customer1': [('milk', 3), ('bread', 5)], 'customer2': [('cereal', 7)]}
答案 1 :(得分:1)
你的内部结构应该是一个列表,而不是一个元组,因为结构是同质的。
{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)],
'customer2': [('cheese', 2), ('cereal', 7)]}
这也允许您对它们使用.append()
,并且可以使用collections.defaultdict
以空列表开始每个值以进一步简化。
答案 2 :(得分:0)
我希望您有一个数据库列表,例如
rows = [('customer1', ('milk', 2)), ('customer12', ('bread', 4))] # etc etc
然后你就可以做到。
for row in rows:
cust_dict[row[0]] = row[1:]
答案 3 :(得分:0)
这是我要做的事情
from collections import defaultdict
data = (
('customer1', 'milk', 3),
('customer1', 'bread', 5),
('customer1', 'eggs', 2),
('customer2', 'cheese', 2),
('customer2', 'cereal', 7),
)
result = defaultdict(list)
for name, what, amount in data:
result[name].append((what, amount))
from pprint import pprint
result = dict(result)
pprint(result)
打印
{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)],
'customer2': [('cheese', 2), ('cereal', 7)]}
答案 4 :(得分:0)
您可以使用内置的defaultdict并将其实例化为列表,并在循环中追加您想要的字段,例如。如果你想要除了第一个元素之外的整行,你可以your_defaultdict_instance[row[0]].append(row[1:])
整齐地构建所有东西。