我有很多条目,我想收集一些简单的统计数据,比如所有可被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)
虽然最小的(在我的书中可能是最优雅的)感觉它并不能很好地表达意图。
所以,我的问题是:
你最喜欢哪种方法来收集这些数据?如果你有更好的选择,请随时提供你自己的选择。
为了澄清下面的一些混乱:
您可以使用^{} 函数。
它过滤一个列表(或者严格地说是iterable),生成一个新列表,其中只包含指定函数计算结果为true的项。
这很好,因为它允许您将统计逻辑包含在函数中,并且
filter
的意图应该非常清楚。Alt 4!但也许您应该将代码重构为一个函数,该函数接受一个应该包含可除数(2和3)的参数。然后你可以有一个更好的函数名。
必须在列表上重复多次并不优雅。
我可能会创建一个允许执行以下操作的函数:
起点应该是这样的:
顺便说一句,“itertools菜谱”有一个做得很像你的alt4的菜谱。
相关问题 更多 >
编程相关推荐