1

だから私は配列を持っています、例えばのようなもの[5,2,2,0]、基準に合格した要素の数を返す関数はありますか?

現在私はこれをやっています:

a = [5,2,2,0]
len([i for i in a if i > 0])

誰かがこのアプローチも提案しました:

sum(b > 0 for b in a)

しかし、IMOはこれは実際には同じことであり、少し読みにくくなっています。

私が使用できるこのような方法はありますか?

def crit(x): return x > 0
a.count(criterion=crit)
4

3 に答える 3

4

他にできることはあまりありませんが、すでに述語がある場合

def crit(x):
   return x > 0

できるよ

sum(map(crit, a))

また

len(filter(crit, a))

 

len([x for x in a if x > 0])が最も効率的ですが、述語を再利用する場合はコードの重複につながる可能性があります。

テスト:

In [6]: %timeit len([x for x in a if x > 0])
100000 loops, best of 3: 3.57 us per loop

In [7]: def crit(x):
   ...:     return x > 0
   ...:

In [8]: %timeit len([x for x in a if crit(x)])
100000 loops, best of 3: 10.1 us per loop

In [9]: %timeit sum([x > 0 for x in a])
100000 loops, best of 3: 5.66 us per loop

In [10]: %timeit sum([crit(x) for x in a])
100000 loops, best of 3: 12 us per loop

In [11]: %timeit sum(map(crit, a))
100000 loops, best of 3: 11.3 us per loop

In [12]: %timeit len(filter(crit, a))
100000 loops, best of 3: 8.21 us per loop

ジェネレーター(ジェネレーターにはありませんlen):

In [13]: %timeit sum(1 for x in a if x > 0)
100000 loops, best of 3: 3.99 us per loop

In [14]: %timeit sum([1 for x in a if crit(x)])
10000 loops, best of 3: 10.6 us per loop

In [15]: %timeit sum(x > 0 for x in a)
100000 loops, best of 3: 6.24 us per loop

In [16]: %timeit sum(crit(x) for x in a)
100000 loops, best of 3: 13 us per loop

imapよりも速いmap

In [17]: %timeit sum(itertools.imap(crit, a))
100000 loops, best of 3: 10.7 us per loop

 

これらすべてをテストした後、私は[13]、[17]、または[14]で行くと思います。

于 2013-02-06T16:11:12.277 に答える
2

私はsumリストを具体化する代わりにアプローチを選びます-それが恐ろしいと思ったら、ヘルパー関数を書いてください:

def count_if(f, iterable):
    return sum(1 for i in iterable if f(i))

またはさらに良いことに、itertoolsドキュメントのレシピの1つを使用してください:

def quantify(iterable, pred=bool):
    "Count how many times the predicate is true"
    return sum(imap(pred, iterable))
于 2013-02-06T16:13:30.723 に答える
1

filter機能が使えますlen(filter(crit, a))

于 2013-02-06T16:11:50.717 に答える