如何在Python中迭代两个或多个列表项的元组?

时间:2009-07-31 02:32:36

标签: python loops

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

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

我想要一个返回的函数combine_to_lines():

"""foo1 bar1
foo2 bar2
foo3 bar3"""

我承认我已经解决了这个问题,所以我要发布答案。但也许其他人有一个更好的或看到我的缺陷。

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

9 个答案:

答案 0 :(得分:14)

没有必要解压缩并重新打包zip返回的元组:

'\n'.join(' '.join(x) for x in zip(a, b))

答案 1 :(得分:9)

zip function“返回一个元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。”

def combine_to_lines(list1, list2):
    return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)])

答案 2 :(得分:7)

>>> a = ['foo1', 'foo2', 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> for i in zip(a,b):
...   print ' '.join(i)
...
foo1 bar1
foo2 bar2
foo3 bar3

答案 3 :(得分:1)

您是否在询问zip功能?

答案 4 :(得分:1)

我意识到这是一个非常古老的问题,但值得注意的是,这可以被视为matrix transposition

>>> 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']]

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

答案 5 :(得分:0)

这是一个单行。如果你这么倾向可以做x + ' ' + y,不确定它是否会变慢。

>>> a = ['foo1', 'foo2' , 'foo3']
>>> b = ['bar1', 'bar2', 'bar3']
>>> '\n'.join(' '.join([x,y]) for (x,y) in zip(a,b))
'foo1 bar1\nfoo2 bar2\nfoo3 bar3'
>>> print _
foo1 bar1
foo2 bar2
foo3 bar3

答案 6 :(得分:0)

'\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b)))

答案 7 :(得分:0)

简单如下:

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

答案 8 :(得分:0)

在python 3.x中:

'\n'.join(' '.join(x) for x in zip(a, b))

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

在python 2.x中:

如果itertools.izip会在其中一个列表用完元素时停止但是itertools.izip_longest将停止直到列表中没有更多元素

import itertools
'\n'.join(' '.join(x) for x in itertools.izip(a, b))

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