打印一个用逗号分隔的列表,但不要在最后加上逗号。

19

我正在编写一段代码,它应该输出一个用逗号分隔的项目列表。该列表是使用 for 循环生成的:

for x in range(5):
    print(x, end=",")

问题是我不知道如何去掉列表中最后一个条目添加的逗号。它输出如下内容:
0,1,2,3,4,

如何去除结尾的,


这里的大多数方法都基于使用单个print调用。为了对每个x值使用单独的调用,最后一个调用将需要以不同的方式处理。这也可以完成 - 请参见如何检测“for”循环中的最后一个元素的Python风格方式是什么?- 但是,这个特定问题最好通过使用与print相关的功能来解决。

8个回答

45

sep=","作为参数传递给print()

你离正确的打印语句很近了。

不需要循环,print函数有一个sep参数和end参数。

>>> print(*range(5), sep=", ")
0, 1, 2, 3, 4

简单解释

print 内置函数可以接受多个参数用于打印输出,非关键字参数将会用 sep 分隔并打印出来。如果没有设置 sep 参数,默认使用一个空格作为分隔符。

>>> print("hello", "world")
hello world

修改sep会产生预期的结果。

>>> print("hello", "world", sep=" cruel ")
hello cruel world

每个参数都将被转换为字符串,就像使用 str() 一样。向 print 语句传递一个可迭代对象将把可迭代对象作为一个参数字符串化。

>>> print(["hello", "world"], sep=" cruel ")
['hello', 'world']

然而,如果您在可迭代对象前面放置星号,则会将其分解为单独的参数,并允许使用sep来达到预期的效果。

>>> print(*["hello", "world"], sep=" cruel ")
hello cruel world

>>> print(*range(5), sep="---")
0---1---2---3---4

使用join作为替代方案

将可迭代对象用给定的分隔符连接成字符串的另一种方法是使用分隔符字符串的join方法。

>>>print(" cruel ".join(["hello", "world"]))
hello cruel world

这样做有些笨拙,因为它要求将非字符串元素显式地转换为字符串。

>>>print(",".join([str(i) for i in range(5)]))
0,1,2,3,4

暴力搜索 - 非Pythonic

您提出的方法是使用循环来连接字符串,并沿途添加逗号。当然,这会产生正确的结果,但这样做会更加费力。

>>>iterable = range(5)
>>>result = ""
>>>for item, i in enumerate(iterable):
>>>    result = result + str(item)
>>>    if i > len(iterable) - 1:
>>>        result = result + ","
>>>print(result)
0,1,2,3,4

你是指 *range(5) 吗? - Ashwini Chaudhary
谢谢您的回复!问题在于我确实需要循环,我上面提供的代码是简化版。当我发布问题时,我自己想出了一个解决方案。我创建了一个字符串变量,逐渐添加带有逗号的字符串。当循环执行最后一次时,我使用if语句来防止向我的变量(我将所有字符串粘贴到其中)中添加逗号。 - user2092743
没问题,即使您使用循环生成可迭代对象(列表?),然后使用print将其呈现到控制台,仍然可以简化您的代码。不需要一个中间字符串来保存逗号。 - Graeme Stuart
“循环连接if语句”方法非常笨拙。我会选择print(*iterable, sep=",")或者print(",".join([str(i) for i in iterable]))其中之一。 - Graeme Stuart

7
你可以使用str.join()函数来创建你想要打印的字符串,然后再将其打印出来。例如 -
print(','.join([str(x) for x in range(5)]))

演示 -

>>> print(','.join([str(x) for x in range(5)]))
0,1,2,3,4

我在上面使用了列表推导式,因为与str.join一起使用时比生成器表达式更快。


1
str.join()是从数据生成自定义字符串的好选择。然而,如果我们只是把字符串传递给 print(),那么这并不是必要的。只需使用print(* iterable, sep = ", ")即可。 - Graeme Stuart

3
为了做到这一点,您可以使用 str.join() 方法。
In [1]: print ','.join(map(str,range(5)))
0,1,2,3,4

首先,我们需要将range(5)中的数字转换为字符串,以便调用str.join()方法。我们可以使用map()操作来完成这一步骤。然后,我们使用逗号,将从map()得到的字符串列表连接起来。


2

你可以使用另一种形式来更接近你原来的代码:

opt_comma="" # no comma on first print
for x in range(5):
    print (opt_comma,x,sep="",end="") # we are manually handling sep and end
    opt_comma="," # use comma for prints after the first one
print() # force new line

当然,本程序的意图可能更好地通过此线程中其他更具Python风格的答案来实现。但在某些情况下,这种方法可能是有用的。
另一个可能性是:
for x in range(5):
    if x:
        print (", ",x,end="")
    else:
        print (x, end="")
print()

在这种特定情况下,这可能有些笨重,但在更复杂的情况下,当您想要在某些东西之间但不是之前或之后具有分隔符,并且您需要缓慢地循环时,这是一种非常有用的技术。 - tripleee

0
一个示例代码:
for i in range(10):
    if i != 9:
        print(i, end=", ")
    else:
        print(i)

结果:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

0
for x in range(5):
    print(x, end=",")
print("\b");

2
依赖于\b来覆盖输出是特定于终端的。如果输出被重定向到文件,则也不会覆盖。 - General Grievance

0
for n in range(5):
    if n == (5-1):
        print(n, end='')
    else:
        print(n, end=',')

我理解你想通过 5-1 来表达什么,但它仍然是一个数字常量。最好将列表大小保存为变量,然后重复使用。 - General Grievance

0
''' 列表是一个列表,所以最后一个元素(索引为-1)会被打印出来,而不带有逗号。
    for i in lista:
        if i != lista[-1]:
            print((i), end= ", ")
    else:
        print((i), end=" ")

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

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