Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印以空格分隔的元素列表_Python_Pretty Print - Fatal编程技术网

Python 打印以空格分隔的元素列表

Python 打印以空格分隔的元素列表,python,pretty-print,Python,Pretty Print,我有一个元素列表,比如自然数。我想用一个空格作为分隔符将它们打印在一行中。但是我不想在列表的最后一个元素之后(或第一个元素之前)留空格 在Python2中,这可以通过以下代码轻松完成。print语句的实现(我必须承认,这很神秘)避免了在换行之前打印额外的空间 L = [1, 2, 3, 4, 5] for x in L: print x, print 但是,在Python 3中,使用print函数的(假定)等效代码似乎在最后一个数字后产生一个空格: L = [1, 2, 3, 4, 5

我有一个元素列表,比如自然数。我想用一个空格作为分隔符将它们打印在一行中。但是我不想在列表的最后一个元素之后(或第一个元素之前)留空格

在Python2中,这可以通过以下代码轻松完成。
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))
这是一个非常好的解决方案,但与Python2代码相比,我发现它违反直觉,而且速度肯定较慢。此外,我知道我可以自己选择是否打印空间,如:

L = [1, 2, 3, 4, 5]
for i, x in enumerate(L):
    print(" " if i>0 else "", x, sep="", end="")
print()
但这比我在Python2中看到的还要糟糕


所以,我的问题是,我是否遗漏了Python 3中的某些内容?
print
函数是否支持我要查找的行为?

您可以将列表作为单独的参数应用:

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()

请注意,这需要手动将
L
中的任何非字符串值转换为字符串

list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
    print(i, end=', ')
print(list[-1])
for循环真的需要那么长时间才能运行吗

试图在列表中用逗号分隔所有str值,在最后一个条目前插入“and”,并得出以下结论:

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而不是loop。 我写了一段关于比较时间的四种不同方法的代码:

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或更大的顺序),请不要使用循环打印列表。

在分隔的列表空间中连接元素:

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

我认为
join
解决方案是不好的,因为:(1)它显式地使用
str
,我觉得这很难看,也不直观,最重要的是(2)它首先构造一个字符串,然后打印它,如果列表很长,这可能是一个坏主意。这回答了我的问题,在Python 3中实际上比
for
循环更快。然而,我感到困惑,因为在Python3中,这需要2.5秒。打印
列表(范围(1000000))
,而原始的Python 2
循环需要0.36秒。在Python3中,打印会降低很多吗?@nickie:在计时中是否包含了
list()
调用?你发布的任何代码和我的答案都不需要它
print()
现在也是一个函数调用,它比
print
语句有更多的开销,Python 3还添加了一个从unicode到字节的编码步骤(虽然是C代码)。不,我在两个版本中都预先创建了列表。如果您觉得有趣的话,我可以发布基准测试的代码。在我的基准测试中,@nickie:
lst=range(100*1000);对于lst中的i:print i,
需要约0.04s,而在python3中
lst=range(100*1000);打印(*lst)
0。08s@m.wasowski:我认为OP在Python 3中也使用了循环。
word = ["test", "crust", "must", "fest"]
word.reverse()
joined_string = ""
for w in word:
   joined_string = w + joined_string + " "
print(joined_string.rstrim())