打印一个由空格分隔的元素列表。

54
我有一个元素列表L,例如自然数。我想用一个空格作为分隔符在一行上打印它们。但我不希望在列表的最后一个元素后(或第一个元素前)有空格。
在Python 2中,可以使用以下代码轻松实现这一点。print语句的实现(我必须承认有些神秘)避免在换行符之前打印额外的空格。
L = [1, 2, 3, 4, 5]
for x in L:
    print x,
print

然而,在Python 3中,使用print函数的(据说)等价代码似乎在最后一个数字后面产生了一个空格:
L = [1, 2, 3, 4, 5]
for x in L:
    print(x, end=" ")
print()

当然,我这个问题也有简单的答案。我知道可以使用字符串连接:

L = [1, 2, 3, 4, 5]
print(" ".join(str(x) for x in L))

这是一个相当不错的解决方案,但与 Python 2 代码相比,我发现它很反直觉,而且肯定更慢。此外,我知道我可以自己选择是否打印空格,比如:
L = [1, 2, 3, 4, 5]
for i, x in enumerate(L):
    print(" " if i>0 else "", x, sep="", end="")
print()

但是,在Python 2中,我拥有的功能比这个更好。

所以,我的问题是,在Python 3中,我是否遗漏了什么? print函数是否支持我正在寻找的行为?


我认为join解决方案很糟糕,因为:(1)它明确使用了str,我认为这很丑陋和反直觉,最重要的是(2)它首先构造一个字符串,然后再打印它,如果列表很长,这可能是个坏主意。 - nickie
我不确定为什么@Braiam编辑了标题并删除了“在Python 3中”的内容。原始问题是很多年前关于Python 2和Python 3之间实践差异的问题。无论如何... - nickie
4个回答

149
你可以将列表作为单独的参数应用:
print(*L)

使用print()函数时,它会自动将每个元素转换为字符串进行输出。可以通过设置sep关键字参数来控制分隔符:

>>> L = [1, 2, 3, 4, 5]
>>> print(*L)
1 2 3 4 5
>>> print(*L, sep=', ')
1, 2, 3, 4, 5
>>> print(*L, sep=' -> ')
1 -> 2 -> 3 -> 4 -> 5

除非您需要将连接后的字符串用于其他用途,否则这是最简单的方法。否则,请使用str.join()

joined_string = ' '.join([str(v) for v in L])
print(joined_string)
# do other things with joined_string

注意,这需要对L中的任何非字符串值进行手动转换为字符串!

@nickie:你的计时器中是否包含了list()调用?对于你发布的代码和我的答案来说,这并不是必需的。print()现在也是一个函数调用,比print语句有更多的开销,并且Python 3还会添加一个编码步骤(虽然是在C代码中)从Unicode到字节。 - Martijn Pieters
1
不,我在两个版本中都事先创建了列表。如果您觉得有趣,我可以发布基准测试的代码。我理解开销,但我们谈论的是近乎数量级的差异。 - nickie
2
@nickie 在我的基准测试中:lst = range(100*1000) ; for i in lst: print i, 耗时约为0.04秒,而在Python3中 lst = range(100*1000) ; print(*lst) 耗时约为0.08秒。 - m.wasowski
3
这个引用中叫什么?这个使用运算符打印的东西叫什么?有人可以指引我去文档吗?谢谢。 - Nithin Gowda
2
@NithinGowda:这是调用表达式语法的一部分,我称之为参数扩展。它不是一个运算符。 - Martijn Pieters
显示剩余11条评论

9
虽然接受的答案非常明确,但我只是想检查时间效率。 最好的方法是打印数字转换为字符串后连接的字符串。
print(" ".join(list(map(str,l))))

请注意,我使用了而不是。 我写了一小段代码来比较时间的4种不同方法:
import time as t

a, b = 10, 210000
l = list(range(a, b))
tic = t.time()
for i in l:
    print(i, end=" ")

print()
tac = t.time()
t1 = (tac - tic) * 1000
print(*l)
toe = t.time()
t2 = (toe - tac) * 1000
print(" ".join([str(i) for i in l]))
joe = t.time()
t3 = (joe - toe) * 1000
print(" ".join(list(map(str, l))))
toy = t.time()
t4 = (toy - joe) * 1000
print("Time",t1,t2,t3,t4)

结果:

时间 74344.76 71790.83 196.99 153.99

输出结果让我感到惊讶。使用“循环方法”和“连接字符串方法”在时间上有很大的差异。

结论:如果列表大小太大(达到10 ** 5或更多),请勿使用循环来打印列表。


1
list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
    print(i, end=', ')
print(list[-1])

请问for循环真的需要更长的运行时间吗?

我试着编写一个程序,将列表中所有字符串值用逗号隔开,并在最后一个条目之前插入“and”,结果是这样的:

spam = ['apples', 'bananas', 'tofu', 'cats']
for i in spam[0:-1]:
    print(i, end=', ')
print('and ' + spam[-1])

1

将列表中的元素用空格分隔:

word = ["test", "crust", "must", "fest"]
word.reverse()
joined_string = ""
for w in word:
   joined_string = w + joined_string + " "
print(joined_string.rstrim())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接