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

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

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

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

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


当前回答

我想用正则表达式提供一个更直观的模式化解决方案。下面的函数将包含任意字符串的字符串化列表作为输入。

逐步解释:您删除了所有的白间距、括号和value_separator(如果它们不是要提取的值的一部分,否则会使正则表达式更复杂)。然后将清理后的字符串拆分为单引号或双引号,并取非空值(或奇数索引值,无论首选项如何)。

def parse_strlist(sl):
import re
clean = re.sub("[\[\],\s]","",sl)
splitted = re.split("[\'\"]",clean)
values_only = [s for s in splitted if s != '']
return values_only

测试样本:“['21',”foo“'6','0',”A“]”

其他回答

>>> import ast
>>> x = '[ "A","B","C" , " D"]'
>>> x = ast.literal_eval(x)
>>> x
['A', 'B', 'C', ' D']
>>> x = [n.strip() for n in x]
>>> x
['A', 'B', 'C', 'D']

上次迭代评估:

使用ast.literal_eval,可以安全地计算表达式节点或包含Python文本或容器显示的字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、字节、数字、元组、列表、字典、布尔值和None。

为了使用JSON进一步完成Ryan的回答,一个非常方便的Unicode转换函数就在这个答案中。

带双引号或单引号的示例:

>print byteify(json.loads(u'[ "A","B","C" , " D"]')
>print byteify(json.loads(u"[ 'A','B','C' , ' D']".replace('\'','"')))
['A', 'B', 'C', ' D']
['A', 'B', 'C', ' D']

使用纯Python-不导入任何库:

[x for x in  x.split('[')[1].split(']')[0].split('"')[1:-1] if x not in[',',' , ',', ']]

eval很危险——你不应该执行用户输入。

如果您有2.6或更高版本,请使用ast而不是eval:

>>> import ast
>>> ast.literal_eval('["A","B" ,"C" ," D"]')
["A", "B", "C", " D"]

一旦你做到了,就把绳子脱下来。

如果您使用的是较旧版本的Python,则可以使用简单的正则表达式来实现所需的功能:

>>> x='[  "A",  " B", "C","D "]'
>>> re.findall(r'"\s*([^"]*?)\s*"', x)
['A', 'B', 'C', 'D']

这不如ast解决方案好,例如,它不能正确处理字符串中的转义引号。但它很简单,不涉及危险的求值,如果您使用的是没有ast的旧Python,那么它可能足以满足您的目的。

这是你能做到的,

**

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

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

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