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)
最小 (そして私の本ではおそらく最もエレガント) ですが、意図をうまく表現していないように感じます。
だから、あなたへの私の質問は次のとおりです。
これらのタイプの統計を収集するには、どの代替手段が最適ですか? より良いものがあれば、自由に独自の代替案を提供してください。
以下の混乱を解消するために:
- 実際には、私のフィルター述語は、この単純なテストよりも複雑です。
- 繰り返し処理するオブジェクトは、単なる数値よりも大きく複雑です
- 私のフィルター関数はより異なっており、1 つの述語にパラメーター化するのが難しい