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

Ily*_*rov 1 python functional-programming

我有一个列表,我想将它分成几部分,就像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))
Run Code Online (Sandbox Code Playgroud)

应该给我

[[0], ["One", 1, 2, 3], ["Two", 4, 5, 6, 7], ["Three"], ["Four"]]
Run Code Online (Sandbox Code Playgroud)

我可以写下面的代码:

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
Run Code Online (Sandbox Code Playgroud)

但我发现它不优雅而不是Pythonic.这里给出类似的方法(使用生成器).

我试图找出itertools这样的某种类型的解决方案,但是如果重复定界(例如我的例子),它们就不能很好地工作.

有没有想法如何以比我当前的代码更多的功能风格来做?

Yar*_*kov 5

您可以简化您的功能:

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

或者这个(在第一次迭代时使用附加的空列表):

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
Run Code Online (Sandbox Code Playgroud)