打印空格分隔的元素列表

54 投票
4 回答
190802 浏览
提问于 2025-04-17 23:16

我有一个元素列表 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 个回答

1

将列表中的元素用空格连接起来:

word = ["test", "crust", "must", "fest"]
word.reverse()
joined_string = ""
for w in word:
   joined_string = w + joined_string + " "
print(joined_string.rstrim())
1
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])
10

虽然大家都说接受的答案很清楚,但我还是想看看在时间效率方面的表现。

最好的方法是把数字转换成字符串后,打印出连接在一起的字符串。

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次方或更多),就不要用循环来打印。

150

你可以把列表里的元素当作单独的参数来使用:

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 中有非字符串的值,你需要手动把它们转换成字符串哦!

撰写回答