Python .join() 与二维数组

0 投票
4 回答
3066 浏览
提问于 2025-04-18 18:31

假设我有这样一个数组:

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

撰写回答