我想知道最简单的方法是将如下列表的字符串表示转换为列表:
x = '[ "A","B","C" , " D"]'
即使在用户在逗号之间加空格,在引号内加空格的情况下,我也需要处理它并将其转换为:
x = ["A", "B", "C", "D"]
我知道我可以用strip()和split()分隔空格,并检查非字母字符。但代码变得非常笨拙。有没有我不知道的快速功能?
我想知道最简单的方法是将如下列表的字符串表示转换为列表:
x = '[ "A","B","C" , " D"]'
即使在用户在逗号之间加空格,在引号内加空格的情况下,我也需要处理它并将其转换为:
x = ["A", "B", "C", "D"]
我知道我可以用strip()和split()分隔空格,并检查非字母字符。但代码变得非常笨拙。有没有我不知道的快速功能?
当前回答
假设您的所有输入都是列表,并且输入中的双引号实际上无关紧要,这可以通过简单的正则表达式替换来完成。这有点过时,但它就像一种魅力。还要注意,输出现在是一个Unicode字符串列表,您没有指定需要它,但考虑到Unicode输入,它似乎是有意义的。
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']
junkers变量包含我们不需要的所有字符的编译正则表达式(为了速度),使用]作为字符需要一些反斜杠技巧。re.sub将所有这些字符都替换为空,我们在逗号处拆分得到的字符串。
注意,这也会从条目u'[“oh no”]'->[u'ohno']中删除空格。如果这不是您想要的,则需要对regexp进行一些升级。
其他回答
使用纯Python-不导入任何库:
[x for x in x.split('[')[1].split(']')[0].split('"')[1:-1] if x not in[',',' , ',', ']]
有一个快速解决方案:
x = eval('[ "A","B","C" , " D"]')
可以通过以下方式删除列表元素中不需要的空白:
x = [x.strip() for x in eval('[ "A","B","C" , " D"]')]
这个解决方案比我在前面的答案中看到的一些简单,但它需要匹配列表中的所有功能。
x = '[ "A","B","C" , " D"]'
[i.strip() for i in x.split('"') if len(i.strip().strip(',').strip(']').strip('['))>0]
输出:
['A', 'B', 'C', 'D']
import ast
l = ast.literal_eval('[ "A","B","C" , " D"]')
l = [i.strip() for i in l]
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,那么它可能足以满足您的目的。