0

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

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

我得到 ['"quote"']

当我执行以下操作时

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

我得到 ['\\"quote\\"']

当我执行以下操作时

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

我得到 ['\\"quote\\"']

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

我使用 Jupyter 和 Python 3.5.2。

谢谢!

4

2 回答 2

0

简答

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

如果你跑

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__()以适合您的方式实现该功能。

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

于 2018-03-21T04:27:24.590 回答
0

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

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

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

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

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

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

但是那个原始字符串是如何表示的呢?

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

很奇怪,对吧?我们如何打印表示

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

这更好,但你可以删除\\"with just\"吗?——你不能。\"是转义字符,反斜杠本身需要转义,这就是您在输出中看到的内容。


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

>>> list2
['\\"quote\\"']
>>> print(list2[0])
\"quote\"
>>> list2[0]
'\\"quote\\"'
于 2018-03-21T02:48:18.423 回答