在Python中将列表的string表示forms转换为列表

我想知道最简单的方法是将如下所示的string列表转换为list

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

甚至在用户在逗号之间放置空格,以及在引号内的空格。 我也需要处理,以便:

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

在Python中。

我知道我可以剥离strip()split()使用拆分运算符的空格,并检查非字母。 但代码变得非常笨拙。 有没有我不知道的快速function?

 >>> import ast >>> x = u'[ "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 :

安全地评估expression式节点或包含Pythonexpression式的string。 提供的string或节点可能只包含以下Python文字结构:string,数字,元组,列表,字典,布尔值和无。

eval是危险的 – 你不应该执行用户input。

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

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

一旦你有了, strip琴弦。

如果您使用的是较旧版本的Python,则可以通过一个简单的正则expression式来获得您想要的结果:

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

这不如ast解决scheme,例如它不正确处理string中的转义报价。 但是这很简单,不涉及危险的评估,如果你使用的是一个没有ast的老版本的Python,那么它可能就足够了。

每当有string的字典列表时, json模块是一个更好的解决scheme。 可以使用json.loads(your_data)函数将其转换为列表。

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

同样

 >>> x = u'[ "A","B","C" , {"D":"E"}]' >>> json.loads(x) [u'A', u'B', u'C', {u'D': u'E'}] 
 import ast l = ast.literal_eval('[ "A","B","C" , " D"]') l = [i.strip() for i in l] 

假设你所有的input都是列表,并且input中的双引号实际上并不重要,可以用一个简单的regexpreplace来完成。 这是有点perl-y,但作品像一个魅力。 还要注意,输出现在是一个unicodestring的列表,你没有指定你需要这个,但是给出unicodeinput似乎是有意义的。

 import re x = u'[ "A","B","C" , " D"]' junkers = re.compile('[[" \]]') result = junkers.sub('', x).split(',') print result ---> [u'A', u'B', u'C', u'D'] 

该junkersvariables包含一个编译的正则expression式(速度)我们不想要的所有字符,作为一个字符需要一些反斜杠欺骗。 re.sub将所有这些字符replace为空,我们将结果string拆分为逗号。

请注意,这也删除了内部条目u'[“oh no”] – > [u'ohno']中的空格。 如果这不是你想要的,正则expression式需要加快一点。

numpy这是一个非常简单的方法

 x = u'[ "A","B","C" , " D"]' list_string = str(x) import numpy as np print np.array(list_string) 

 >>> [ "A","B","C" , " D"] 

有一个快速的解决scheme:

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

列表元素中的不需要的空格可能会以这种方式被删除:

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

如果你知道你的列表只包含带引号的string,这个pyparsing的例子会给你你剥离string的列表(甚至保留原始的Unicode-ness)。

 >>> 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'] 

如果你的列表可以有更多的数据types,甚至包含列表中的列表,那么你将需要一个更完整的语法 – 就像在pyparsing维基上的一个 ,它将处理元组,列表,整数,浮点数和引用string。 将使用Python版本回到2.4。