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))) |
这是一条单行线。如果你这么想的话,你可以做
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 |