【问题标题】: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 + ']')?
  • 你可以在],[..
  • 在正则表达式中捕获组,然后拆分捕获组?
  • 为什么不能一开始就使用列表?

标签: python list split comma


【解决方案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']]
    

    这很脆弱,因为它取决于字符串是否完全按照您布置的方式工作。它应用以下步骤:

    1. string[1:-1] - 去掉括号中的 []
    2. replace("'") - 去掉所有单引号,因为它们无助于拆分。
    3. split('],[') - 在连接子列表的子字符串上拆分最外层的字符串。
    4. [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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-03
      • 2018-07-18
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多