Skip to main content
 首页 » 编程设计

通过条件给定的定界符将列表拆分为多个部分的 Pythonic 方法

2025年05月04日15kerrycode

我有一个列表,我想将它分成最常见的部分,例如 str.split() 适用于具有以下差异的字符串:

  1. 分隔符由谓词给出。如果列表元素的谓词为 True,则此元素被视为分隔符。
  2. 我想在结果列表中保留分隔符。

例如:

split_by_predicate([0, "One", 1, 2, 3,  
                    "Two", 4, 5, 6, 7, "Three", "Four"], 
                    predicate=lambda x: isinstance(x, str)) 

应该给我

[[0], ["One", 1, 2, 3], ["Two", 4, 5, 6, 7], ["Three"], ["Four"]] 

我可以写出如下代码:

def split_by_predicate(it, predicate): 
    lst = [] 
    cur = [] 
    for element in it: 
       if predicate(element): 
          lst.append(cur) 
          cur = [] 
       cur.append(element) 
    lst.append(cur) 
    return lst 

但我觉得它不优雅,也不符合 Pythonic。给出了类似的方法here (使用生成器)。

我试图找出某种基于 itertools 的解决方案,例如 this one , 但如果重复分隔符(如我的示例),它们将无法正常工作。

有什么想法可以比我当前的代码更实用吗?

请您参考如下方法:

您可以将您的功能简化为:

def split_by_predicate(it, predicate): 
    lst = [[]] 
    for element in it: 
        if predicate(element): 
            lst.append([]) 
        lst[-1].append(element) 
    return lst 

或者这个(在第一次迭代时跳过附加空列表):

def split_by_predicate(it, predicate): 
    lst = [[]] 
    for i, element in enumerate(it): 
        if predicate(element) and i: 
            lst.append([]) 
        lst[-1].append(element) 
    return lst