如何在python中解压缩嵌套元组?

时间:2014-06-25 10:04:04

标签: python nested iteration tuples

让我们说我有用户(约翰,安娜)可以按自己选择的数量订购水果(橙子,苹果)。

这是我在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。我究竟做错了什么? 我应该使用除元组以外的其他东西吗?这是我的迭代不好吗?

3 个答案:

答案 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)