【问题标题】:Printing a list separated with commas, without a trailing commaPython - 打印出用逗号分隔的列表
【发布时间】:2021-07-20 20:54:20
【问题描述】:

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

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

问题是我不知道如何去掉与列表中最后一个条目一起添加的最后一个逗号。它输出这个:

0,1,2,3,4,

如何删除结尾的 ' , ' ?

【问题讨论】:

    标签: python for-loop printing


    【解决方案1】:

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

    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(["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)
    • 感谢您的回复!问题是我确实需要一个循环,我上面提供的代码是简化的代码。就在我发布问题时,我自己提出了一个解决方案。我创建了一个字符串变量,在其中不断添加字符串,并带有逗号,当循环最后一次运行时,我做了一个 if 语句,不向我的变量添加逗号(我将所有字符串粘贴到其中)
    • 没问题,它仍然可以稍微简化您的代码以使用循环生成可迭代(列表?),然后使用 print 将其呈现到控制台。不需要中间的字符串来保存逗号。
    • “用 if 语句连接的循环”方法非常笨拙。我会选择print(*iterable, sep=",")print(",".join([str(i) for i in iterable]))
    【解决方案2】:

    您可以使用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 一起使用时。

    【讨论】:

    • str.join() 是从数据生成自定义字符串的好选择。但是,如果我们只是将字符串传递给print(),那么就没有必要了。只需使用print(*iterable, sep=", ")
    【解决方案3】:

    为此,您可以使用str.join()

    In [1]: print ','.join(map(str,range(5)))
    0,1,2,3,4
    

    我们需要先将range(5) 中的数字转换为字符串才能调用str.join()。我们使用map() 操作来做到这一点。然后我们用逗号, 加入从map() 获得的字符串列表。

    【讨论】:

      【解决方案4】:

      您可以使用的另一种形式,更接近您的原始代码:

      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
      

      当然,您的程序的意图可能会更好地服务于该线程中的其他更pythonic 的答案。不过,在某些情况下,这可能是一种有用的方法。

      【讨论】:

      • 在这种特殊情况下这很笨拙,但在更复杂的情况下,当您希望在缓慢循环的某些内容之间而不是之前或之后有分隔符时,这是一种非常有用的技术。
      【解决方案5】:
      for n in range(5):
          if n == (5-1):
              print(n, end='')
          else:
              print(n, end=',')
      

      【讨论】:

      • 我明白你对5-1 的要求,但它仍然是一个常数。最好将列表大小保存为变量然后重复使用。
      【解决方案6】:

      示例代码:

      for i in range(10):
          if i != 9:
              print(i, end=", ")
          else:
              print(i)
      

      结果:

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

      【讨论】:

        【解决方案7】:
        for x in range(5):
            print(x, end=",")
        print("\b");
        

        【讨论】:

        • 依赖\b 覆盖输出是特定于终端的。如果将输出重定向到文件,它也不会覆盖。
        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        相关资源
        最近更新 更多