gpt4 book ai didi

python - 如何根据谓词拆分序列?

转载 作者:IT老高 更新时间:2023-10-28 20:37:20 25 4
gpt4 key购买 nike

我经常遇到需要将一个序列拆分为两个满足和不满足给定谓词的元素子序列(保留原始的相对顺序)。

这个假设的“拆分器”函数在实际中看起来像这样:

>>> data = map(str, range(14))
>>> pred = lambda i: int(i) % 3 == 2
>>> splitter(data, pred)
[('2', '5', '8', '11'), ('0', '1', '3', '4', '6', '7', '9', '10', '12', '13')]

我的问题是:

does Python already have a standard/built-in way to do this?

这个功能当然不难编码(见下面的附录),但出于多种原因,我更喜欢使用标准/内置方法而不是自编方法。

谢谢!



附录:

到目前为止,我发现在 Python 中处理此任务的最佳标准函数是 itertools.groupby。然而,要将它用于此特定任务,需要为每个列表成员调用两次谓词函数,我觉得这很愚蠢:

>>> import itertools as it
>>> [tuple(v[1]) for v in it.groupby(sorted(data, key=pred), key=pred)]
[('0', '1', '3', '4', '6', '7', '9', '10', '12', '13'), ('2', '5', '8', '11')]

(上面的最后一个输出与前面显示的所需输出不同,因为满足谓词的元素的子序列排在最后而不是第一个,但这非常小,如果需要也很容易修复。)

可以避免对谓词的冗余调用(基本上是通过“内联内存”),但我在这方面的最佳尝试变得相当复杂,与 splitter(data, pred ):

>>> first = lambda t: t[0]
>>> [zip(*i[1])[1] for i in it.groupby(sorted(((pred(x), x) for x in data),
... key=first), key=first)]
[('0', '1', '3', '4', '6', '7', '9', '10', '12', '13'), ('2', '5', '8', '11')]

顺便说一句,如果您不关心保留原始排序,sorted 的默认排序顺序可以完成工作(因此 key 参数可以从sorted 调用):

>>> [zip(*i[1])[1] for i in it.groupby(sorted(((pred(x), x) for x in data)),
... key=first)]
[('0', '1', '3', '4', '6', '7', '9', '10', '12', '13'), ('2', '5', '8', '11')]

最佳答案

我知道你说过你不想编写自己的函数,但我无法想象为什么。您的解决方案涉及编写自己的代码,您只是没有将它们模块化为函数。

这正是你想要的,是可以理解的,并且每个元素只评估一次谓词:

def splitter(data, pred):
yes, no = [], []
for d in data:
if pred(d):
yes.append(d)
else:
no.append(d)
return [yes, no]

如果您希望它更紧凑(出于某种原因):

def splitter(data, pred):
yes, no = [], []
for d in data:
(yes if pred(d) else no).append(d)
return [yes, no]

关于python - 如何根据谓词拆分序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com