在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。