【发布时间】:2008-10-01 10:37:20
【问题描述】:
我有一个可迭代的条目,我想收集一些简单的统计数据,比如所有可被 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)
虽然最小(在我的书中可能是最优雅的),但感觉并不能很好地表达意图。
所以,我的问题是:
您最喜欢哪种方法来收集这些类型的统计数据?如果您有更好的选择,请随时提供您自己的替代方案。
为了澄清下面的一些困惑:
- 实际上,我的过滤谓词比这个简单的测试更复杂。
- 我迭代的对象比数字更大更复杂
- 我的过滤函数更加不同,难以参数化到一个谓词中
【问题讨论】: