我有一个列表,我想将它分成最常见的部分,例如 str.split() 适用于具有以下差异的字符串:
- 分隔符由谓词给出。如果列表元素的谓词为
True,则此元素被视为分隔符。 - 我想在结果列表中保留分隔符。
例如:
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
