【发布时间】:2013-05-16 16:21:09
【问题描述】:
如果我有三个列表,例如
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
想这样打印出来
1 4 7
2 5 8
3 6 9
我该怎么做?
【问题讨论】:
如果我有三个列表,例如
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
想这样打印出来
1 4 7
2 5 8
3 6 9
我该怎么做?
【问题讨论】:
使用 list comprehension 生成器表达式,没有 map 函数:
'\n'.join(' '.join(str(y) for y in x) for x in zip(a,b,c))
【讨论】:
map?是的,当您必须构建 lambda 或 partial 时,它的可读性会降低,但在这种情况下,我认为它的可读性更多。 (另外,这里没有列表推导,你有一个生成器表达式。)
from itertools import izip as zip 添加到脚本的顶部。
join 在你给它一个迭代器时会创建一个列表(至少对于 CPython 和 PyPy,可能对于所有实现)。此外,map 不会在 3.x 中创建列表。最重要的是,创建一个包含 3 个元素的列表的性能影响是如此微不足道,以至于即使进行此讨论也是愚蠢的。使用更具可读性的任何一个。
应该这样做:
'\n'.join(' '.join(map(str,tup)) for tup in zip(a,b,c))
【讨论】:
' ',因为 OP 在列之间有两个空格。或者将其保留为 ' ' 并使用 str(x).ljust(2) 而不是 str。
其中最难的部分是转置数组。但这很简单,zip:
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
t = zip(a, b, c)
现在您只需将其打印出来:
print('\n'.join(' '.join(map(str, row)) for row in t))
【讨论】: