python - 遍历其元素具有可变长度的列表

python - iterate through list whose elements have variable length

如何遍历 Python 中元素为可变长度列表的列表或元组?例如我想做

tup=( [1,2], [2,3,5], [4,3], [4,5,6,7] )
for a,b,c,d in tup:
     print a,b,c,d

然后有 tup 的短元素,例如 None。我找到了以下代码的解决方法,但我相信一定有更好的方法。

tup=( [1,2], [2,3,5], [4,3], [4,5,6,7] )
for a,b,c,d in [ el if len(el)==4 else [ el[i] if i<len(el) else None for i in range(4)] for el in tup ]:
     print a,b,c,d

其中4实际上是"longest"元素的长度。

有没有更好的方法?

要匹配您自己的输出,您可以使用 izip_longest 填充 None 并再次转置以恢复原始顺序:

from itertools import izip_longest

tup=( [1,2], [2,3,5], [4,3], [4,5,6,7] )
for a,b,c,d in zip(*izip_longest(*tup)):
    print(a,b,c,d)
(1, 2, None, None)
(2, 3, 5, None)
(4, 3, None, None)
(4, 5, 6, 7)

如果 intfloat 等会更好,那么您可以为 izip_longest 函数指定一个不同的 fillvalue 参数:

tup=( [1,2], [2,3,5], [4,3], [4,5,6,7])
for a,b,c,d in zip(*izip_longest(*tup,fillvalue=0)):
    print(a,b,c,d)

(1, 2, 0, 0)
(2, 3, 5, 0)
(4, 3, 0, 0)
(4, 5, 6, 7)

根据您的 print 声明判断您可能正在使用 python2 但对于使用 python3 的任何人作为 @TimHenigan it is zip_longest.

如果您不需要列表,您可以使用 itertools.izip 其中 returns 一个迭代器:

 from itertools import izip_longest, izip

tup = ( [1, 2], [2, 3, 5], [4, 3], [4, 5, 6, 7])
for a, b, c, d in izip(*izip_longest(*tup, fillvalue=0)):
    print(a, b, c, d)

在Python3中我们可以这样做:

for i in tup:
    for j in i:
        print(j,"",end="")
    print()