如何分隔逗号分隔的列表

时间:2013-05-25 05:06:17

标签: python list split comma

例如,

string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"

如何将上面的每个列表作为新列表的元素创建一个新列表?

我试过

string = string.split (',')

但是它也会被列表中的逗号分开,这是我不想要的。

4 个答案:

答案 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']]

这很脆弱,因为它取决于字符串的工作方式与它们的布局完全相同。它适用以下步骤:

  1. string[1:-1] - 抛出支持字符串的[]
  2. replace("'") - 扔掉所有单引号,因为它们无法帮助拆分。
  3. split('],[') - 拆分连接子列表的子字符串上最外面的字符串。
  4. [x.split(', ') for ... - FOR EACH GENERATED SUBSTRING, split that substring on its internal pair connector - in this case,`。
  5. 这更能证明这可以做到,而不是一个非常好的主意。这是一个非常脆弱的解决方案,因为间距或引用的任何不规则都会破坏它。


    更好的解决方案是使用正则表达式查找匹配列表的子字符串,获取列表,并将其处理为列表。

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