【问题标题】:In Python, how to append a raw string to list?在 Python 中,如何将原始字符串附加到列表中?
【发布时间】:2018-08-30 00:29:30
【问题描述】:

我有一个空列表,我想在它后面附加一个原始字符串。例如,我有 list1 = [] 并且我想附加以下字符串 '\"quote\"',所以我会得到 ['\"quote\"']。但是,当我执行以下操作时

list1 = []  
text = '\"quote\"'  
list1.append(text)  
list1  

我明白了 ['"报价"']

当我执行以下操作时

list2 = []  
text = r'\"quote\"'  
list2.append(text)  
list2  

我明白了 ['\\"quote\\"']

当我执行以下操作时

list3 = []  
text = '\"quote\"'.replace('\"','\\"')  
list3.append(text)  
list3  

我明白了 ['\\"quote\\"']

我怎样才能得到 ['\"quote\"']?

我使用 Jupyter 和 Python 3.5.2。

谢谢!

【问题讨论】:

  • python 在打印列表时为您转义字符。如果你 print 单个字符串值,它应该显示为你想要的
  • '\\"quote\\"' 只是字符串\"quote\" 的字符串表示形式。当您尝试将列表作为一个整体转换为字符串时,您会得到它。
  • 不要只将变量输出为 Jupyter 单元格的最后一行...实际使用打印功能
  • 你想如何使用这个字符串,你希望它包含什么字符序列?很明显,您对您编写的字符串文字、字符串的显示方式以及字符串中的实际内容之间的关系感到困惑。我们需要更多信息来了解如何解释事物并确定最终代码应该是什么样子。
  • 你看到的输出不是 Python 存储的。这就是我们都想告诉你的

标签: python list append rawstring


【解决方案1】:

让我们澄清一些事情。你有一个列表这一事实并不重要,这些都是一样的

>>> '"quote"' == "\"quote\""
True
>>> '"quote"' == '\"quote\"'
True

现在,让我们使用原始字符串。

>>> '\"quote\"' == r'\"quote\"'
False

正如预期的那样,我们打印原始字符串,也是预期的。

>>> print(r'\"quote\"')
\"quote\"

但是原始字符串 是如何表示的

>>> repr(r'\"quote\"')
=> '\'\\\\"quote\\\\"\''

很奇怪,对吧?那么我们打印表示怎么样?

>>> print(repr(r'\"quote\"'))
'\\"quote\\"'

这样更好,但你能用\" 删除\\" 吗? - 你不能。 \" 是一个转义字符,反斜杠本身需要转义,这就是您在输出中看到的内容。


要回答这个问题,list2 已正确存储,您只是在错误地查看输出。

>>> list2
['\\"quote\\"']
>>> print(list2[0])
\"quote\"
>>> list2[0]
'\\"quote\\"'

【讨论】:

    【解决方案2】:

    简答

    如果你问'如何让它工作'..那么一个简单的解决方案是编写一个简单地将列表转换为字符串的函数。

    如果你运行

    print('\'' + r'\"quote\"' + '\'')
    

    你会看到

    '\"quote\"'
    

    如你所愿。现在只需要在列表上应用这个逻辑。所以它会是这样的(我使用的是 python 2.7.14,但我认为它与你的版本相似):

    def prettyPrintList(l):
        print('[' + ','.join(map(lambda x: '\'' + x + '\'', l)) + ']')
    
    
    prettyPrintList([r'\"quote\"'])
    

    在python中可能有更好的方法来编写它,我通常不使用python。

    长答案

    我想解决问题的根源:“为什么它不起作用?”

    在 OO 语言中——比如 python——当你打印一个对象时,比如一个列表,它实际上是隐式调用一个函数。

    在 python 中,该函数是 str()

    所以从技术上讲,你正在运行代码

    print list.__str()__
    

    该函数定义了您看到的行为。
    对于列表,我假设它的功能与我的“prettyPrint”函数非常相似——它可能会遍历所有元素并在它们上调用.__str__(),然后用逗号连接它们并用括号括起来。

    所以为了理解输出,让我们看一下.__str__(),当我们直接在'\"quote\"'上调用它时

    >>> '\"quote\"'
    '"quote"'
    >>> '\"quote\"'.__str__()
    '"quote"'
    >>> r'\"quote\"'.__str__()
    '\\"quote\\"'
    >>> 
    

    如您所见,REPL 实际上输出了.__str__() 的结果。同样,结果将取决于该函数的定义。

    在我看来,python 选择了一种奇怪的方式来实现它。

    如果我在 JavaScript 中做同样的事情,它会在浏览器和节点之间产生不同的结果(在控制台中)。在浏览器中,它会产生与您想要的结果相似的结果

    console.log(['\\"item\\"'])
     > ["\"item\""]
    

    在控制台中

    > console.log(['\\"quote\\"'])
    [ '\\"quote\\"' ]
    undefined
    > console.log(['\"quote\"'])
    [ '"quote"' ]
    

    如您所见,这实际上取决于核心功能的实现。

    您可以保证完全按照您的需要打印的最佳方法是在代码中指定您希望如何“字符串化”它。基本上,以适合您的方式实现函数.__str__()

    我希望我回答了您的问题并说服了您解决方案。
    如果你有更多的cmets,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2011-01-04
      • 1970-01-01
      • 2019-02-13
      • 2018-09-25
      • 2013-07-15
      • 2012-12-05
      相关资源
      最近更新 更多