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

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

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

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

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


当前回答

这是你能做到的,

**

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

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

逐步解释:您删除了所有的白间距、括号和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“]”

因此,根据所有答案,我决定对最常见的方法进行计时:

from time import time
import re
import json

my_str = str(list(range(19)))
print(my_str)

reps = 100000

start = time()
for i in range(0, reps):
    re.findall("\w+", my_str)
print("Regex method:\t", (time() - start) / reps)

start = time()
for i in range(0, reps):
    json.loads(my_str)
print("JSON method:\t", (time() - start) / reps)

start = time()
for i in range(0, reps):
    ast.literal_eval(my_str)
print("AST method:\t\t", (time() - start) / reps)

start = time()
for i in range(0, reps):
    [n.strip() for n in my_str]
print("strip method:\t", (time() - start) / reps)

    regex method:     6.391477584838867e-07
    json method:     2.535374164581299e-06
    ast method:         2.4425282478332518e-05
    strip method:     4.983267784118653e-06

所以最终正则表达式获胜!

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

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

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

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

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

不需要外部库。

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

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