Python .join() 与二维数组
假设我有这样一个数组:
foo = [["a", "b"], ["c", "d"]]
如果我想打印出里面每个小数组的元素,我可以这样做:
for array_ in foo:
for element in array_:
print element
这样做之后,我会得到这样的结果:
a
b
c
d
那么,我该如何把每个小数组的元素竖着打印出来,然后再把它们和其他数组连接起来呢?像这样:
ac
bd
4 个回答
-1
In [1]: foo = [["a", "b"], ["c", "d"]]
In [2]: print "\n".join("".join(f) for f in zip(*foo))
ac
bd
里面的 zip
调用会把数组进行转置,也就是把行和列互换。
In [3]: zip(*foo)
Out[3]: [('a', 'c'), ('b', 'd')]
第一个 join
会把每一组元组连接在一起,也就是把它们合成一个字符串。
In [4]: ["".join(element) for element in zip(*foo)]
Out[4]: ['ac', 'bd']
最后,列表中的每个元素会通过外面的 join
连接起来。
1
map
也可以用:
["".join(x) for x in map(None,*foo)]
只需再连接一次,就能得到字符串:
"\n".join(["".join(x) for x in map(None,*foo)])
在这种情况下,map
的表现就像 zip
,它会交换元素的位置:
In [39]: foo = [["a", "b"], ["c", "d"]]
In [40]: map(None,*foo)
Out[40]: [('a', 'c'), ('b', 'd')]
2
这里有一个更简洁的写法,使用了 map()
函数:
import operator as op
map(op.add ,*foo)
=> ['ac', 'bd']
4
一种方法是使用 zip()
函数:
>>> foo = [["a", "b"], ["c", "d"]]
>>> [''.join(a) for a in zip(*foo)]
['ac', 'bd']
zip(*foo)
会返回一个包含元组的列表,其中第 i 个元组包含每个输入列表的第 i 个元素。而 join()
则是把列表中的内容连接起来。
如果列表中的列表变量 foo
很大,你可以使用 itertools
模块中的高效版本的 zip()
:
>>> from itertools import izip
>>> foo = [["a", "b"], ["c", "d"]]
>>> [''.join(a) for (a) in izip(*foo)]
['ac', 'bd']