【问题标题】:Create lines of text, '\n'.join(my_list) is missing trailing newline :-(创建文本行,'\n'.join(my_list) 缺少尾随换行符 :-(
【发布时间】:2016-04-15 09:36:47
【问题描述】:

我想将 N 个字符串加入到新字符串中。每个项目一行:

my_list=['one', 'two', 'three']
lines='\n'.join(my_list)

不幸的是,我需要在lines 的每一行末尾添加一个尾随换行符。在上述解决方案中,最后一行缺少换行符。

我搜索一个简单且对新手友好的解决方案。

...我使用 Python 2.7

【问题讨论】:

    标签: python string


    【解决方案1】:

    只需像这样添加另一个\n(因为join()的输出也是一个字符串):

    my_list=['one', 'two', 'three']
    print '\n'.join(my_list)+'\n'
    

    【讨论】:

      【解决方案2】:

      在 Python 3.6 中,您还可以使用生成器表达式 (PEP289):

      ''.join(f"{row}\n" for row in my_list)
      

      这对我来说有点干净。

      【讨论】:

      • python 3.6 新的不是生成器表达式,而是 fstrings。见PEP 498
      【解决方案3】:

      除了手动添加到 join 的返回值之外,您还可以(也可以手动)将空字符串附加到列表中。

      >>> my_list=['one', 'two', 'three']
      >>> my_list.append('')
      >>> '\n'.join(my_list)
      'one\ntwo\nthree\n'
      

      【讨论】:

      • 没有真正的理由这样做。它看起来比'\n'.join(my_list)+'\n' 更有效率,但是由于当不可变对象只有一个引用时python 会作弊,它通常效率较低。附加方式在我的机器上慢了大约 25%并且,与 '\n' 相比,添加 '' 的原因并不明显。
      • @Dunes 在 python 源代码中找不到证据。你能指点我吗?谢谢!
      • @Bharel 你可以通过s= b'some-non-constant-string'.decode(); s = s + 'some string' 看到直接的证据。比较之前和之后的id(s) 的值,注意它们是相同的。如果您使用字符串文字初始化 s,那么 id 会有所不同。该实现跨越代码的一部分。第一名是Objects/unicodeobject.c:PyUnicode_appendunicode_modifiable。第二个是Python/ceval.c:unicode_concatenate,如果s = s + ts += t被调用,就会被调用。如果没有这个,PyUnicode_Append 中的条件将永远不会触发。
      • @Dunes 太棒了。非常感谢!我实际上正在查看 PyUnicode_Concat 并没有意识到还有另一个 unicode 连接。 (想知道谁也叫 Append)
      • PyUnicode_Concat 是str.__add__ 的实现。如果您对str 进行子类化,那么当您将子类实例添加在一起时会调用它。如果 PyUnicode_Append 检测到 + 的两个操作数都具有 str 类型,则它是解释器的微优化。
      【解决方案4】:

      之前使用打印,它可以工作:

      >>> print '\n'.join(ls)
      one
      two
      three
      >>> 
      

      检查this answer 以了解有关字符串和字符串表示的差异的详细信息,如提到的here

      Here也一样,你可以找到解决办法。

      【讨论】:

      • 抱歉,我需要一个字符串。 print() 没有帮助。
      • @guettli:我需要更彻底地阅读 :) 添加 '\n' 是否像上面提到的那样对您有帮助?
      • 好的,这就是我想知道的。所以这就是你想要的。
      猜你喜欢
      • 2011-11-10
      • 2015-01-26
      • 1970-01-01
      • 2019-07-05
      • 2019-02-12
      • 2017-07-18
      • 1970-01-01
      • 2011-04-01
      • 2016-02-02
      相关资源
      最近更新 更多