在for循环中如何解包元组?

88
我发现了以下代码:

for i, a in enumerate(attributes):
   labels.append(Label(root, text = a, justify = LEFT).grid(sticky = W))
   e = Entry(root)
   e.grid(column=1, row=i)
   entries.append(e)
   entries[i].insert(INSERT,"text to insert")

我不理解 i, a 部分,查找有关 for 的信息没有带来任何有用的结果。当我尝试并实验代码时,我得到以下错误:

ValueError: 需要多于1个值来拆包

有人知道它的作用吗?或者有一个更具体的术语与之相关,我可以通过谷歌了解更多吗?

8个回答

154

你可以通过谷歌搜索"元组解包"。在Python中,这种技巧可以用于多个地方。最简单的用法是在赋值时:

>>> x = (1,2)
>>> a, b = x
>>> a
1
>>> b
2

在for循环中它的工作方式类似。如果可迭代对象的每个元素都是一个tuple,那么您可以指定两个变量,并且循环中的每个元素将被拆分为这两个变量。

>>> x = [(1,2), (3,4), (5,6)]
>>> for item in x:
...     print "A tuple", item
A tuple (1, 2)
A tuple (3, 4)
A tuple (5, 6)
>>> for a, b in x:
...     print "First", a, "then", b
First 1 then 2
First 3 then 4
First 5 then 6
< p > enumerate 函数创建一个元组可迭代对象,因此可以这样使用。


27

枚举基本上在for循环中提供了一个可用的索引。因此:

for i,a in enumerate([4, 5, 6, 7]):
    print(i, ": ", a)

将输出:

0: 4
1: 5
2: 6
3: 7

7
你可以将 for index,value 的方式与使用 ( ) 直接解包元组相结合。当你想在循环中设置多个相关值,而不需要一个中间的元组变量或字典时,这种方法是很有用的,例如:
users = [
    ('alice', 'alice@example.com', 'dog'),
    ('bob', 'bob@example.com', 'cat'),
    ('fred', 'fred@example.com', 'parrot'),
]

for index, (name, addr, pet) in enumerate(users):
    print(index, name, addr, pet)

打印

0 alice alice@example.com dog
1 bob bob@example.com cat
2 fred fred@example.com parrot

1
谢谢,这正是我在寻找的。我已经知道如何使用 enumerate,但不知道 for idx, (name, addr, pet) 元组解包方法。干杯! - mildmelon

6

以这段代码为例:

elements = ['a', 'b', 'c', 'd', 'e']
index = 0

for element in elements:
  print element, index
  index += 1

您可以循环遍历列表并存储一个索引变量。但是,enumerate()函数可以更简洁地完成同样的操作:

elements = ['a', 'b', 'c', 'd', 'e']

for index, element in enumerate(elements):
  print element, index

enumerate返回一个元组((1, 'a'), (2, 'b'), ...),需要使用index, element表示法分别赋值给两个不同的变量。


6
[i for i in enumerate(['a','b','c'])]

结果:

[(0, 'a'), (1, 'b'), (2, 'c')]

2
你好,这个特性有一个名称吗?我在谷歌上搜索不到相关结果。[i for i in enumerate(['a','b','c'])] - Zaid Khan
1
这被称为列表推导式。list comprehension - jlhasson

2
enumerate函数返回一个生成器对象,该对象在每次迭代时生成一个元组,该元组包含了元素的索引(i),默认从0开始编号,以及元素本身(a)。for循环方便地允许您访问这些生成元组的两个字段并为它们分配变量名。请保留HTML标签。

2

简单来说,在for循环中从列表中解压元组是可行的。enumerate()函数使用当前索引和整个当前项创建一个元组,例如(0, ('bob', 3))。

我编写了一些测试代码来演示这一点:

Original Answer翻译成"最初的回答"

    list = [('bob', 3), ('alice', 0), ('john', 5), ('chris', 4), ('alex', 2)]

    print("Displaying Enumerated List")
    for name, num in enumerate(list):
        print("{0}: {1}".format(name, num))

    print("Display Normal Iteration though List")
    for name, num in list:
        print("{0}: {1}".format(name, num))

Python中元组解包的简单性可能是我最喜欢的事情之一 :D


0
let's get it through with an example:
list = [chips, drinks, and, some, coding]
  i = 0
  while i < len(list):
               
           if i % 2 != 0:
                print(i)
                  i+=1
       output:[drinks,some]

    now using EMUNERATE fuction:(precise)
   list = [chips, drinks, and, coding]
for index,items in enumerate(list):
            
             print(index,":",items)
OUTPUT:   0:drinks
          1:chips
          2:drinks
          3:and
          4:coding

                          


                         

1
请正确格式化您的答案。 - Tobias Wilfert
1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

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