打印空格分隔的元素列表
我有一个元素列表 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
函数中是否被支持?
4 个回答
将列表中的元素用空格连接起来:
word = ["test", "crust", "must", "fest"]
word.reverse()
joined_string = ""
for w in word:
joined_string = w + joined_string + " "
print(joined_string.rstrim())
list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
print(i, end=', ')
print(list[-1])
循环真的会花那么多时间来运行吗?
我在尝试做一个功能,想把列表中的所有字符串值打印出来,用逗号分隔,最后一个值前面加上“和”,于是我想出了这个:
spam = ['apples', 'bananas', 'tofu', 'cats']
for i in spam[0:-1]:
print(i, end=', ')
print('and ' + spam[-1])
虽然大家都说接受的答案很清楚,但我还是想看看在时间效率方面的表现。
最好的方法是把数字转换成字符串后,打印出连接在一起的字符串。
print(" ".join(list(map(str,l))))
注意,我用了map,而不是循环。 我写了一小段代码,展示了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次方或更多),就不要用循环来打印。
你可以把列表里的元素当作单独的参数来使用:
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
中有非字符串的值,你需要手动把它们转换成字符串哦!