gpt4 book ai didi

python - 在可迭代的东西中计算匹配元素的大多数pythonic方法

转载 作者:太空狗 更新时间:2023-10-29 17:12:31 24 4
gpt4 key购买 nike

我有一个可迭代的条目,我想在这些条目上收集一些简单的统计数据,比如所有可被 2 整除的数字的计数和所有可被 3 整除的数字的计数。

我的第一个选择,虽然只遍历列表一次并避免列表扩展(并记住 split loop 重构),但看起来相当臃肿:

(替代 1)

r = xrange(1, 10)

twos = 0
threes = 0

for v in r:
if v % 2 == 0:
twos+=1
if v % 3 == 0:
threes+=1

print twos
print threes

这看起来相当不错,但有将表达式扩展为列表的缺点:

(备选方案 2)

r = xrange(1, 10)

print len([1 for v in r if v % 2 == 0])
print len([1 for v in r if v % 3 == 0])

我真正想要的是像这样的函数:

(备选方案 3)

def count(iterable):
n = 0
for i in iterable:
n += 1
return n

r = xrange(1, 10)

print count(1 for v in r if v % 2 == 0)
print count(1 for v in r if v % 3 == 0)

但这看起来很像可以在没有函数的情况下完成的事情。最终的变体是这样的:

(替代 4)

r = xrange(1, 10)

print sum(1 for v in r if v % 2 == 0)
print sum(1 for v in r if v % 3 == 0)

虽然最小(在我的书中可能是最优雅的)但感觉它并没有很好地表达意图。

所以,我的问题是:

您最喜欢哪种方法来收集这些类型的统计数据?如果您有更好的选择,请随时提供您自己的替代方案。

为了澄清下面的一些混淆:

  • 实际上,我的过滤谓词比这个简单的测试要复杂得多。
  • 我迭代的对象比数字更大更复杂
  • 我的过滤器函数更加不同,难以参数化为一个谓词

最佳答案

恕我直言,必须多次遍历列表并不优雅。

我可能会创建一个允许执行以下操作的函数:

twos, threes = countmatching(xrange(1,10),
lambda a: a % 2 == 0,
lambda a: a % 3 == 0)

起点是这样的:

def countmatching(iterable, *predicates):
v = [0] * len(predicates)
for e in iterable:
for i,p in enumerate(predicates):
if p(e):
v[i] += 1
return tuple(v)

顺便说一句,“itertools recipes”有一个与您的 alt4 非常相似的食谱。

def quantify(seq, pred=None):
"Count how many times the predicate is true in the sequence"
return sum(imap(pred, seq))

关于python - 在可迭代的东西中计算匹配元素的大多数pythonic方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/157039/

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