关于循环:如何迭代Python中两个或多个列表项的元组?

How do I iterate over the tuples of the items of two or more lists in Python?

本问题已经有最佳答案,请猛点这里访问。

具体来说,我有两个字符串列表,希望将它们组合成一个字符串,其中每一行是列表中的下两个字符串,用空格分隔:

1
2
a = ['foo1', 'foo2', 'foo3']
b = ['bar1', 'bar2', 'bar3']

我想要一个函数combine_to_lines(),它将返回:

1
2
3
"""foo1 bar1
foo2 bar2
foo3 bar3"""

我承认我已经解决了这个问题,所以我要把答案贴出来。但也许其他人有更好的或者看到了我的缺点。

更新:我过度简化了上面的示例。在我的实际问题中,这些行的格式更加复杂,需要解包从zip()返回的元组。但是,感谢mhawke提出了这个例子最简单的解决方案。


不需要对zip返回的元组进行解包和重新打包:

1
2
'
'
.join(' '.join(x) for x in zip(a, b))

zip函数"返回元组列表,其中i-th元组包含来自每个参数序列或iterables的i-th元素。"

1
2
3
def combine_to_lines(list1, list2):
    return '
'
.join([' '.join((a, b)) for a, b in zip(list1, list2)])


1
2
3
4
5
6
7
8
>>> a = ['foo1', 'foo2', 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> for i in zip(a,b):
...   print ' '.join(i)
...
foo1 bar1
foo2 bar2
foo3 bar3

我意识到这是一个非常古老的问题,但值得注意的是,这可以看作是一个矩阵转置。

1
2
3
4
5
6
7
8
9
>>> import numpy
>>> data = numpy.array([['foo1','foo2','foo3'],['bar1','bar2','bar3']])
>>> print(data)
[['foo1' 'foo2' 'foo3']
 ['bar1' 'bar2' 'bar3']]
>>> print(data.transpose())
[['foo1' 'bar1']
 ['foo2' 'bar2']
 ['foo3' 'bar3']]

如果您处理的是大型数据集或更多列表,这可能是一个更有效的解决方案。


你是在问拉链的功能吗?


在Python 3。

1
2
'
'
.join(' '.join(x) for x in zip(a, b))

zip返回元组列表。当a或b中较短的一个停止时,zip停止。

在Python 2。

如果itertools.izip在某个列表中的元素用完时停止,但itertools.izip最长将停止,直到列表中没有更多元素为止。

1
2
3
4
5
6
import itertools
'
'
.join(' '.join(x) for x in itertools.izip(a, b))

'
'
.join(' '.join(x) for x in itertools.izip_longest(a, b))


简单为:

1
"".join([a[x] +"" + b[x] for x in range(len(a))])


1
2
'
'
.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b)))

这是一条单行线。如果你这么想的话,你可以做x + ' ' + y,不确定它是否会变慢。

1
2
3
4
5
6
7
8
9
10
11
>>> a = ['foo1', 'foo2' , 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> '
'
.join(' '.join([x,y]) for (x,y) in zip(a,b))
'foo1 bar1
foo2 bar2
foo3 bar3'

>>> print _
foo1 bar1
foo2 bar2
foo3 bar3