python - 有没有办法根据条件将列表“分叉”成两个
问题描述
我在团队的代码中看到了重复几次的模式,看起来像这样
numbers = [1, 2, 3, 4]
even_numbers = [n for n in numbers if n % 2 == 0]
odd_numbers = [n for n in numbers if n % 2 != 0]
我想知道某处是否有一个功能(我环顾四周但找不到它)会做这样的事情
numbers = [1, 2, 3, 4]
even_numbers, odd_numbers = fork(numbers, lambda x: x % 2 == 0)
所以,我正在寻找的这个函数将接收一个可迭代的函数和一个函数,并返回两个列表,一个是与提供的条件匹配的值,另一个是不匹配的值。
python的标准库周围有什么东西可以实现这一点吗?
解决方案
我通常称之为这个sift
,但partition
也很好。
另一个,itertools-less 实现可能是
def sift(iterable, predicate):
t = []
f = []
for value in iterable:
(t if predicate(value) else f).append(value)
return (t, f)
even, odd = sift([1, 2, 3, 4, 5], lambda x: x % 2 == 0)
编辑:对于一个稍微复杂一点的实现,大约快 30%(无论如何在我的 Python 安装上):
def sift2(iterable, predicate):
t = []
f = []
ta = t.append
fa = f.append
for value in iterable:
(ta if predicate(value) else fa)(value)
return (t, f)
推荐阅读
- ansible - 指定标签时无法运行 Ansible 剧本
- html - 如何在 HTML 中的 div 的垂直轴的中心对齐文本?
- kotlin - 有没有办法为 2 个 editTexts 制作 1 个 Textwatcher?
- python - 如何找到一个数字的所有除数的总和,而不包括它
- python - 使用python将日期时间范围分配给变量
- c - VSCode C 问题:在 Windows 上调试和构建 C
- scala - HashMap 只显示一个键值
- gitlab - 远程存储库上的 Gitlab 镜像失败通知
- schemacrawler - SchemaCrawler 用户名和角色
- scala - Scala Spark:展平键/值结构数组