【问题标题】:Splitting a list of lists and strings by a string按字符串拆分列表和字符串列表
【发布时间】:2013-04-19 17:28:22
【问题描述】:

是否有一种方便的 Pythonic 方法可以通过搜索字符串拆分列表(即使列表包含非字符串并且具有嵌套列表)。例如,假设我想用 ',' 分割以下内容:

[[ 'something', ',', 'eh' ], ',', ['more'], ',', 'yet more', '|', 'even more' ]

这将变成:

[[[ 'something', ',', 'eh' ]], [['more']], ['yet more', '|', 'even more']]

【问题讨论】:

    标签: python list split


    【解决方案1】:

    看看itertools.groupby

    In [1]: from itertools import groupby
    
    In [2]: lst = [[ 'something', ',', 'eh' ], ',', ['more'], ',', 'yet more', '|', 'even more' ]
    
    In [3]: [list(group) for key, group in groupby(lst, lambda x: x!=',') if key]
    Out[3]: [[['something', ',', 'eh']], [['more']], ['yet more', '|', 'even more']]
    

    它基本上根据标准 (item != ',') 将列表中的项目分成组,并且理解检查 if k 过滤掉 False 的组 - 即等于 ',' 的项目。

    In [4]: for key, group in groupby(lst, lambda x: x!=','):
       ...:     print key, list(group)
       ...:     
    True [['something', ',', 'eh']]
    False [',']
    True [['more']]
    False [',']
    True ['yet more', '|', 'even more']
    

    【讨论】:

    • @astex - 好吧,它会根据!=',' 将列表中的项目分成组,而理解检查if k 会过滤掉False 的组——即相等的项目到','
    • 等价于from functools import partial from operator import ne [list(g) for k, g in groupby(L, key=partial(ne, ',')) if k]
    【解决方案2】:

    迟到但 FWIW,我认为 itertools.takewhileiter 与哨兵值的组合提供了一个快速的解决方案

    from itertools import takewhile
    
    z = [[ 'something', ',', 'eh' ], ',', ['more'], ',',
      'yet more', '|', 'even more' ]
    z = iter(z)
    def provider():
      return list(takewhile(lambda x: x != ',', z))
    
    for i in iter(provider, []):
      print i
    
    ... 
    [['something', ',', 'eh']]
    [['more']]
    ['yet more', '|', 'even more']
    

    【讨论】: