我有一个可迭代的条目,我想收集一些简单的统计数据,比如所有可被 2 整除的数字的计数和所有可被 3 整除的数字的计数。
我的第一个选择,虽然只遍历列表一次并避免列表扩展(并牢记拆分循环重构),但看起来相当臃肿:
(备选案文 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)
虽然最小(在我的书中可能是最优雅的),但感觉它并不能很好地表达意图。
所以,我对你的问题是:
您最喜欢哪种选择来收集这些类型的统计数据?如果您有更好的选择,请随时提供您自己的替代方案。
为了消除下面的一些混淆:
- 实际上,我的过滤谓词比这个简单的测试更复杂。
- 我迭代的对象比数字更大更复杂
- 我的过滤器函数更加不同并且难以参数化为一个谓词