9

嗨,我正在构建一个字典,其中每个键是客户名称,每个值是每个客户购买的元组列表,如下所示:(产品,数量)。例如:

{'customer1': (('milk', 3), ('bread', 5), ('eggs', 2)),
 'customer2': (('cheese', 2), ('cereal', 7))}

我正在根据 SQL 查询的结果填充字典。作为一个不熟悉 Python 的 Java 程序员,有人可以建议“pythonic”的方式来做到这一点吗?查询中的每一行都包含客户名称、产品、数量。

4

5 回答 5

13

首先,我会使用列表而不是元组作为字典条目。主要区别在于列表是可变的,而元组不是。

我认为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)]}
于 2012-05-15T13:26:22.703 回答
2

你的内部结构应该是一个列表,而不是一个元组,因为结构是同质的。

{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)],
 'customer2': [('cheese', 2), ('cereal', 7)]}

这也将允许您.append()在它们上使用,并且您可以使用collections.defaultdict空列表开始每个值以进一步简化。

于 2012-05-15T13:26:19.530 回答
1

我希望您有一个来自数据库的列表列表,例如

rows = [('customer1', ('milk', 2)), ('customer12', ('bread', 4))] # etc etc

然后你可以简单地做。

for row in rows:
    cust_dict[row[0]] = row[1:]
于 2012-05-15T13:23:33.263 回答
1

这是我要做的

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)]}
于 2012-05-15T13:25:35.430 回答
0

您可以使用内置的defaultdict并将其实例化为列表,并在循环中附加您想要的字段,例如。如果您想要除第一个元素之外的整行,您可以这样做your_defaultdict_instance[row[0]].append(row[1:]),这将整齐地构建所有内容。

于 2012-05-15T13:27:02.007 回答