如何分隔逗号分隔的列表
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]
【讨论】:
以上是关于如何分隔逗号分隔的列表的主要内容,如果未能解决你的问题,请参考以下文章