例如,
string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
如何将上面的每个列表作为新列表的元素创建一个新列表?
我试着做
string = string.split (',')
但它也用我的列表中的逗号分隔它,这是我不想要的。
你可以使用ast.literal_eval
:
>>> import ast
>>> strs = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> ast.literal_eval("[" + strs + "]")
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
>>> 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'])
(
)
x,y,z = 'a',2,[12,'bb']
执行的是:
- 评估右侧部分,它正在执行 eval("'a',2,[12,'bb']")
并创建一个元组
- 评估左侧部分
- 在左侧元组中解包右侧元组
>>> for i in string.split(","):
... print i
...
['SING'
'Dance']
['Talk'
'Scream']
['Run'
'Walk']
适用于您的特定示例的单线:
>>> 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(', ')
对于 x ... - 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]