Ily*_*rov 1 python functional-programming
我有一个列表,我想将它分成几部分,就像str.split()字符串的作品一样,有以下不同之处:
True列表的元素,则此元素被视为分隔符.例如:
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像这样的某种类型的解决方案,但是如果重复定界(例如我的例子),它们就不能很好地工作.
有没有想法如何以比我当前的代码更多的功能风格来做?
您可以简化您的功能:
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)