如何在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
实际上是&#34;最长的&#34;元件。
有更好的方法吗?
答案 0 :(得分:7)
要匹配您自己的输出,您可以使用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)
如果int
,float
等等更好,那么您可以为fillvalue
函数指定不同的izip_longest
参数:
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 commented below的任何人,它都是zip_longest
。
如果您不需要列表,可以使用返回迭代器的itertools.izip:
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)
答案 1 :(得分:0)
在Python 3中,我们可以这样做:
for i in tup:
for j in i:
print(j,"",end="")
print()