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

时间:2015-05-05 18:32:58

标签: python list loops iterator

如何在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;元件。

有更好的方法吗?

2 个答案:

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

如果intfloat等等更好,那么您可以为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()