【问题标题】:Printing lists onto tables in python在python中将列表打印到表上
【发布时间】: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

我该怎么做?

【问题讨论】:

标签: python list


【解决方案1】:

使用 list comprehension 生成器表达式,没有 map 函数:

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

【讨论】:

  • 首先,如果您正在做的只是映射您已经拥有的命名良好的函数,为什么不使用map?是的,当您必须构建 lambdapartial 时,它的可读性会降低,但在这种情况下,我认为它的可读性更多。 (另外,这里没有列表推导,你有一个生成器表达式。)
  • @abarnert:您刚刚自己回答了您的问题:map 不必要地创建了一个列表,该列表没有创建,因为我使用了生成器表达式(抱歉命名错误,已编辑)。生成器比列表更干净。我还应该使用 zip 的功能等价物,所以将 from itertools import izip as zip 添加到脚本的顶部。
  • @pvoosten:实际上,join 在你给它一个迭代器时会创建一个列表(至少对于 CPython 和 PyPy,可能对于所有实现)。此外,map 不会在 3.x 中创建列表。最重要的是,创建一个包含 3 个元素的列表的性能影响是如此微不足道,以至于即使进行此讨论也是愚蠢的。使用更具可读性的任何一个。
【解决方案2】:

应该这样做:

'\n'.join(' '.join(map(str,tup)) for tup in zip(a,b,c))

【讨论】:

  • +1,如果没有其他原因,您在 36 秒内回答了这个问题。
  • 我想你想要' ',因为 OP 在列之间有两个空格。或者将其保留为 ' ' 并使用 str(x).ljust(2) 而不是 str
  • 等一下,这是错误的...... OP 正在尝试打印转置的列表。
  • 这不会给出 OP 要求的输出。
  • @abarnert -- 谢谢。直到你提到它,我才注意到这一点。
【解决方案3】:

其中最难的部分是转置数组。但这很简单,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))

【讨论】:

  • 恕我直言,一个非常易读的解决方案。我喜欢将 zip 分开(与其他答案不同),因为转置和显示是完全不同的事情。
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 2018-10-15
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多