gpt4 book ai didi

python - 惯用的 Python has_one

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:04 25 4
gpt4 key购买 nike

我刚刚发明了一个愚蠢的小辅助函数:

def has_one(seq, predicate=bool):
"""Return whether there is exactly one item in `seq` that matches
`predicate`, with a minimum of evaluation (short-circuit).
"""
iterator = (item for item in seq if predicate(item))
try:
iterator.next()
except StopIteration: # No items match predicate.
return False
try:
iterator.next()
except StopIteration: # Exactly one item matches predicate.
return True
return False # More than one item matches the predicate.

因为我能想出的最可读/最惯用的内联方式是:

[predicate(item) for item in seq].count(True) == 1

... 这对我来说很好,因为我知道 seq 很小,但感觉很奇怪。 这里是否有一个我忘记的惯用语阻止我不得不打破这个助手?

澄清

回想起来,这是一个提出的问题,虽然我们得到了一些很好的答案!我正在寻找:

  • 明显且可读的内联习惯用法或标准库函数,在这种情况下可以接受急切求值。
  • 一个更明显和可读性更强的辅助函数——因为它正在分解一个完整的其他函数,所以只有最少量的评估似乎是可以接受的。

@Stephan202为辅助函数和 @Martin v. Löwis 想出了一个非常酷的习惯用法在谓词返回 bool 值的假设下,想出了一个更简单的内联习语。感谢@大家的帮助!

最佳答案

调用any怎么样?两次,在迭代器上(Python 2.x 和 3.x 兼容)?

>>> def has_one(seq, predicate=bool):
... seq = (predicate(e) for e in seq)
... return any(seq) and not any(seq)
...
>>> has_one([])
False
>>> has_one([1])
True
>>> has_one([0])
False
>>> has_one([1, 2])
False

any 将最多采用 一个 元素,该元素从迭代器计算为 True。如果第一次成功,第二次失败,则只有一个元素匹配谓词。

编辑:我看到Robert Rossney建议一个通用版本,它检查 n 个元素是否与谓词完全匹配。让我加入乐趣,使用all :

>>> def has_n(seq, n, predicate=bool):
... seq = (predicate(e) for e in seq)
... return all(any(seq) for _ in range(n)) and not any(seq)
...
>>> has_n(range(0), 3)
False
>>> has_n(range(3), 3)
False
>>> has_n(range(4), 3)
True
>>> has_n(range(5), 3)
False

关于python - 惯用的 Python has_one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583364/

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