例如,
string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
如何将上面的每个列表作为新列表的元素创建一个新列表?
我试过
string = string.split (',')
但是它也会被列表中的逗号分开,这是我不想要的。
答案 0 :(得分:5)
您可以使用ast.literal_eval
:
>>> import ast
>>> strs = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> ast.literal_eval("[" + strs + "]")
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
答案 1 :(得分:1)
>>> eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']")
>>> (['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk'])
>>>
>>> list(eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"))
>>> [['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
为什么eval("'a',2,[12,'bb']")
返回('a', 2, [12, 'bb'])
而前面没有(
而评估字符串末尾没有)
?
我们必须考虑how the interpreter acts when it encounters the evaluated expression as the right part of an expression from which it performs an unpacking.
当解释器执行以下行(其中没有parens)时
x,y,z = 'a',2,[12,'bb']
所执行的是:
- 评估正确的部分,正在进行eval("'a',2,[12,'bb']")
和它会创建一个元组
- 评估左侧部分
- 在左元组中解包右元组
答案 2 :(得分:0)
适用于您的具体示例的单行程序:
>>> string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> [x.split(', ') for x in string[1:-1].replace("'", "").split('],[')]
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
这很脆弱,因为它取决于字符串的工作方式与它们的布局完全相同。它适用以下步骤:
string[1:-1]
- 抛出支持字符串的[
和]
。replace("'")
- 扔掉所有单引号,因为它们无法帮助拆分。split('],[')
- 拆分连接子列表的子字符串上最外面的字符串。[x.split(', ')
for ... - FOR EACH GENERATED SUBSTRING, split that substring on its internal pair connector - in this case
,`。这更能证明这可以做到,而不是一个非常好的主意。这是一个非常脆弱的解决方案,因为间距或引用的任何不规则都会破坏它。
更好的解决方案是使用正则表达式查找匹配列表的子字符串,获取列表,并将其处理为列表。
regex_string = '(?<=\[)[^\]]+(?=\])'
matcher = re.compile(regex_string)
substring_list = matcher.findall(string)
list_of_lists = [x.split(', ') for x in substring_list]
答案 3 :(得分:0)
>>> for i in string.split(","):
... print i
...
['SING'
'Dance']
['Talk'
'Scream']
['Run'
'Walk']