如何分隔逗号分隔的列表

Posted

技术标签:

【中文标题】如何分隔逗号分隔的列表【英文标题】:How to separate comma separated lists 【发布时间】:2013-05-25 05:06:17 【问题描述】:

例如,

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

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

我试过了

string = string.split (',')

但它也用我的列表中的逗号分隔它,这是我不想要的。

【问题讨论】:

你的最终目标是什么? ast.literal_eval('[' + string + ']')? 你可以在],[.. 在正则表达式中捕获组,然后拆分捕获组? 为什么不能一开始就使用列表? 【参考方案1】:

你可以使用ast.literal_eval:

>>> import ast
>>> strs = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> ast.literal_eval("[" + strs + "]")
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]

【讨论】:

【参考方案2】:
>>> 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. 当解释器执行以下行时(其中没有括号)

x,y,z = 'a',2,[12,'bb']

执行的是: - 评估正确的部分,这就是 eval("'a',2,[12,'bb']")它创建一个元组 - 评估左侧部分 - 在左元组中解包右元组

【讨论】:

@Haidro 我知道使用 eval() 很棘手。但我认为每个人都应该注意使用它的条件。这就是为什么最好提供指向此信息的链接。但也请阅读您提供链接的页面上的 S.Lott 和 martineau 的 cmets。如果它如此危险,为什么它仍然存在于 Python 中?我认为我们必须避免每次看到某些主题为“评估”、“html 正则表达式”等时产生巴甫洛夫式的反应【参考方案3】:
>>> for i in string.split(","):
...     print i
... 
['SING'
 'Dance']
['Talk'
 'Scream']
['Run'
 'Walk']

【讨论】:

这就是他所说的。【参考方案4】:

适用于您的具体示例的单线:

>>> 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 x in ... - 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]

【讨论】:

以上是关于如何分隔逗号分隔的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中将列表输出为逗号分隔值?

如何将逗号分隔的字符串转换为列表?

如何使用 SQL 查询创建逗号分隔的列表?

C#如何检测包含逗号分隔的整数列表的变量?

数组中的逗号分隔列表

如何从包含逗号分隔条目的变量中创建(不同的)值列表?