我想知道最简单的方法是将如下列表的字符串表示转换为列表:

x = '[ "A","B","C" , " D"]'

即使在用户在逗号之间加空格,在引号内加空格的情况下,我也需要处理它并将其转换为:

x = ["A", "B", "C", "D"] 

我知道我可以用strip()和split()分隔空格,并检查非字母字符。但代码变得非常笨拙。有没有我不知道的快速功能?


当前回答

import ast
l = ast.literal_eval('[ "A","B","C" , " D"]')
l = [i.strip() for i in l]

其他回答

如果您知道您的列表只包含带引号的字符串,这个pyparsing示例将为您提供剥离字符串的列表(甚至保留原始Unicode特性)。

>>> from pyparsing import *
>>> x =u'[ "A","B","C" , " D"]'
>>> LBR,RBR = map(Suppress,"[]")
>>> qs = quotedString.setParseAction(removeQuotes, lambda t: t[0].strip())
>>> qsList = LBR + delimitedList(qs) + RBR
>>> print qsList.parseString(x).asList()
[u'A', u'B', u'C', u'D']

如果您的列表可以有更多的数据类型,甚至可以在列表中包含列表,那么您将需要一个更完整的语法-如pyparsing-examples目录中的语法,它将处理元组、列表、int、浮点和带引号的字符串。

这是你能做到的,

**

x = '[ "A","B","C" , " D"]'
print(list(eval(x)))

**最好的答案是公认的答案

虽然这不是一个安全的方法,但最好的答案是公认的。当答案发布时,我并没有意识到评估的危险。

有一个快速解决方案:

x = eval('[ "A","B","C" , " D"]')

可以通过以下方式删除列表元素中不需要的空白:

x = [x.strip() for x in eval('[ "A","B","C" , " D"]')]

如果有字符串化的字典列表,json模块是更好的解决方案。可以使用json.loads(your_data)函数将其转换为列表。

>>> import json
>>> x = '[ "A","B","C" , " D"]'
>>> json.loads(x)
['A', 'B', 'C', ' D']

类似地

>>> x = '[ "A","B","C" , {"D":"E"}]'
>>> json.loads(x)
['A', 'B', 'C', {'D': 'E'}]

在处理存储为Pandas DataFrame的报废数据时,可能会遇到这样的问题。

如果值列表以文本形式显示,则此解决方案非常有用。

def textToList(hashtags):
    return hashtags.strip('[]').replace('\'', '').replace(' ', '').split(',')

hashtags = "[ 'A','B','C' , ' D']"
hashtags = textToList(hashtags)

Output: ['A', 'B', 'C', 'D']

不需要外部库。