在for循环中解压缩列表列表

时间:2019-11-28 14:25:54

标签: python list

假设我以以下方式创建列表:

a = [[0, 1], [2, 3]]

如果我执行以下for循环:

for b in a:
    print(b)

我明白了

[0, 1]
[2, 3]

这对我来说很有意义,因为我正在寻找a的元素,在这种情况下,它们是子列表。但是,如果执行:

for b, c in a:
    print(b, c)

我明白了

0 1
2 3

我本来希望得到

[0, 1] [2, 3]

Python是否有这种明显的理由来解压缩列表?我的意思是,为什么当我在请求列表中的对象时,Python突然为我提供列表的子元素的元素?

4 个答案:

答案 0 :(得分:3)

您要在此处解压缩为整数:

>>> for b, c in a:
...     print(b, c)
...     print(type(b), type(c))
... 
0 1
<class 'int'> <class 'int'>
2 3
<class 'int'> <class 'int'>

换一种说法,比较以下两个:

>>> b, c = a; print(b, c)
[0, 1] [2, 3]
>>> b, c = a[0]; print(b,c)
0 1

答案 1 :(得分:2)

指定时:

for b, c in a:
    print(b, c)

您可以将其读取为:for each element in a, unpack into the tuple "b, c"

答案 2 :(得分:1)

了解此处使用的Assignment Statement很有帮助。相关部分在这里:

  
      
  • 如果目标列表是一个没有尾随逗号的目标,   可以选择在括号中将对象分配给该目标。

  •   
  • 其他:该对象必须是可迭代的,且项目数与   在目标列表中有目标,并且从   从左到右,到相应的目标。

  •   

password = '%PsC\;=sQ}X4DWA%K' escaped_password = URI.escape(password) # => "%25PsC%5C;=sQ%7DX4DWA%25K" uri.password = escaped_password 循环本质上可以归结为:

for

现在让我们看看您的迭代对象是什么:

for (object) in (iterable):

但是,当您使用Assignment Statement时,“ Else”子句适用。

[0, 1]  # object1: list
[2, 3]  # object2: list

将对象视为内部可迭代对象,并将每个对象解压缩到内部对象,即内部的for (obj1, obj2 of object) in (iterable): s:

int

答案 3 :(得分:1)

您遇到的是拆包赋值,该赋值将iterable的元素分配给多个变量。要获得预期的行为,请执行以下操作:

b, c = a
print(b, c)

for b, c in a:a一样通过for b in a:进行迭代,但是由于每个元素都是2元素可迭代的,因此它自己的元素将解压缩到b和{{ 1}}。看看这样做会发生什么:

c

您会得到一个错误,因为a = [[0, 1], [2, 3, 4]] for b, c in a: print(b, c) 的元素要多于要分配给变量的元素。