让我们说我有用户(约翰,安娜)可以按自己选择的数量订购水果(橙子,苹果)。
这是我在python中所做的:
orders = (('John', (('apples', 3), ('oranges', 1))),
('Anna', (('oranges', 6))))
我想迭代订单:
for user, order in orders:
for fruit, quantity in order:
print "%s wants %d %s" % (user, quantity, fruit)
这是我期待的输出:
John wants 3 apples
John wants 1 oranges
Anna wants 6 oranges
我得到ValueError: too many values to unpack
。我究竟做错了什么?
我应该使用除元组以外的其他东西吗?这是我的迭代不好吗?
答案 0 :(得分:7)
显示确切的追溯会很有用。
错误只是Anna的命令实际上并不是嵌套元组:它是一个简单的元组。你最后错过了一个逗号:
orders = (('John', (('apples', 3), ('oranges', 1))),
('Anna', (('oranges', 6),)))
# ^ here
记住它是制作元组的逗号,而不是括号。
正如其他人所说的那样,嵌套的词汇在这里会更合适。
答案 1 :(得分:2)
丹尼尔给出了一个很好的答案:
我做错了什么?
但要解决你的第二个问题:
我应该使用除元组以外的其他内容吗?
我想说这更适合dictionary:
>>> orders = {'John': {'apples': 3, 'oranges': 1}, 'Anna': {'oranges': 6}}
>>> for user, order in orders.items():
for fruit, quantity in order.items():
print "{0} wants {1} {2}".format(user, quantity, fruit)
Anna wants 6 oranges
John wants 1 oranges
John wants 3 apples
(请注意,字典不保证保留其内容的顺序 - 如果订单至关重要,则可以使用替代collections.OrderedDict
来保证插入订单的保留。)
这对于回答像" John想要多少苹果这样的问题特别有用?"
>>> orders['John']['apples']
3
可以改变,以防止没有订购水果的人,例如,如果你想找出"总共订购了多少苹果?"
>>> sum(order.get('apples', 0) for order in orders.values())
3
答案 2 :(得分:0)
好吧,我不会使用dict(dict)
,而是list(x)
,其中x
是一个简单的类,代表人。
class Buyer(object):
def __init__(self, name):
self.name = name
self.items = {}
def purchase(self, item, amount=1):
if item in self.items.keys():
self.items[item] += amount
else:
self.items[item] = amount
orders = []
b1 = Buyer("John")
b1.purchase("apples", 3)
b1.purchase("oranges", 1)
orders.append(b1)
b2 = Buyer("Anna")
b2.purchase("oranges", 6)
orders.append(b2)
for order in orders:
for thing, num in order.items.iteritems():
print "%s wants %d %s" % (order.name, num, thing)