使用Python字典进行数据填充

9

你好,我正在建立一本字典,其中每个键都是客户姓名,每个值都是由每个客户购买的元组列表,例如(product, quantity)。

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

我正在根据SQL查询的结果填充字典。作为一名新手Python程序员,有人能建议一下“pythonic”的做法吗?查询结果中每一行都包含客户姓名、产品和数量。


我会说这很大程度上取决于您之后要对数据做什么。您介意详细说明吗? - Pavel
你有尝试过什么吗?你觉得你的方法为什么“不符合Python风格”? - Brendan Wood
我将在Django网页中填充一个HTML表格。我不确定的地方是如何对字典条目值执行.append()操作。 - JCB
你可以使用以下代码向字典中添加新元素 dict["key"] = value(参见http://docs.python.org/tutorial/datastructures.html#dictionaries)。 - Pavel
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)]}

2

由于结构是同质的,因此您的内部结构应该是列表而不是元组。

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

这还可以让你在它们上面使用.append(),并且你可以使用collections.defaultdict来以空列表的形式启动每个值,以进一步简化。

1

我希望您从数据库中有一个列表的列表,例如:

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

然后你可以简单地执行。

for row in rows:
    cust_dict[row[0]] = row[1:]

显然,我无法看到您的数据库层返回了什么。 - Jakob Bowyer

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接