当前位置: 首页 > 面试题库 >

如何根据谓词拆分序列?

闽哲
2023-03-14
问题内容

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

这个假设的“分割器”功能在运行中看起来像这样:

>>> 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')]

我的问题是:

Python是否已经有标准/内置的方式来做到这一点?

此功能当然不难编写代码(请参阅下面的附录),但是由于多种原因,我宁愿使用标准/内置方法,也不愿使用自卷式方法。

谢谢!

附录:

到目前为止,我发现用于在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')]

问题答案:

内置模块中more_itertools有一个名为的函数partition,该函数完全可以满足topicstarter的要求。

from more_itertools import partition

numbers = [1, 2, 3, 4, 5, 6, 7]
predicate_false, predicate_true = partition(lambda x: x % 2 == 0, numbers)

print(list(predicate_false), list(predicate_true))

结果是[1, 3, 5, 7] [2, 4, 6]



 类似资料:
  • 我想根据特殊字符(如“=”)将一个句子拆分为单词。我尝试了以下代码,但无法得到确切答案,请参阅我的代码: 代码的输出是: 0 C: D: E:=99.993340#0.000000#0.035810#0.000000#0.000179#0.000358#0.000000#0.000000#1.999614#3071.407671_Total=99.993340#0.000000#0.035810#

  • 问题内容: 我试图根据该行的单元格中的值将其分为两行。例如,我具有以下表结构(这是一个临时表,没有任何键,索引或任何其他内容,我可以在另一个临时表中选择拆分结果): 然后,应将其拆分为: 问题答案: 我将使用

  • 问题内容: 我在包含一个大字符串的表中有一个 文本 字段,我要分离的字符串的每个部分都被一个小方块分开。 搜索时,我发现这可能是一个ascii值,所以我运行了它 返回 27 如何根据此ascii值将该字段拆分为单独的字段? 预先感谢克里斯 编辑:当前数据看起来像什么的例子。如果可能的话,将TEXT放在=之前作为标题将非常有用。 ABS_ID = 1234567 PERSON_ID = 123456

  • 问题内容: 从美学角度和性能角度来看,基于条件将项目列表拆分为多个列表的最佳方法是什么?相当于: 有没有更优雅的方法可以做到这一点? 更新:这是实际的用例,以更好地解释我正在尝试做的事情: 问题答案: 有没有更优雅的方法可以做到这一点? 该代码完全可读,而且非常清晰! 再次,这很好! 使用集合可能会稍微改善性能,但这是微不足道的差异,而且我发现列表理解要容易阅读得多,并且你不必担心顺序被弄乱了,重

  • 问题内容: 我正在寻找一种最有效的方法,根据序列中缺少的数字将数字列表分成较小的列表。例如,如果初始列表为: 该函数将产生: 要么 会导致: 问题答案: 旧Python文档中的Python 3版本代码: 每当关键函数更改其返回值时,itertools模块中的函数都会生成中断。诀窍在于,返回值是列表中的数字减去列表中元素的位置。当数字中有空格时,此差异会更改。 该功能来自operator模块,您必须

  • 我找到了一个解决方案,但速度非常慢: 不使用外部模块(Numpy等),你有什么想法吗?