25

ここで最初の質問なので、すぐに始めます:

Python 2.7を使用

私はアイテムの辞書を持っています。キーはタプル (x,y) として表される x,y 座標であり、すべての値はブール値です。

指定された値を持つアイテムの数を取得するための迅速でクリーンな方法を見つけようとしています。どのキーが特定の値を持っているかを知る必要はありません。

ここに同様の投稿があります: How many items in a dictionary share the same value in Python , but I need to do a Dictionary returned, just a integer.

私が最初に考えたのは、アイテムを繰り返し処理し、それぞれの True 値などのカウントを維持しながら、それぞれをテストすることです。私はまだPythonに慣れていないので、すべてのライブラリを知らないので、これを行うためのより良い/より速く/より簡単な方法があるかどうか疑問に思っています。

前もって感謝します。

4

2 に答える 2

36

この最初の部分は、主に楽しみのためのものです。おそらく、自分のコードでは使用しないでしょう。

sum(d.values())

値の数を取得しTrueます。(もちろん、 でFalse値の数を取得できますlen(d) - sum(d.values()))。


もう少し一般的には、次のようなことができます。

sum(1 for x in d.values() if some_condition(x))

この場合、if xは の代わりに問題なく機能し、if some_condition(x)ほとんどの人が実際のコードで使用するものです)

私がここに投稿した 3 つの解決策のうち、上記が最も慣用的であり、私が推奨するものです


最後に、これはもう少し巧妙に書くことができると思います。

sum( x == chosen_value for x in d.values() )

これは、True + True == 2. 賢いことが常に良いとは限りません。ほとんどの人は、このバージョンは上記のものよりも少しあいまいであると考えていると思います (したがって、より悪い)。

于 2012-11-19T21:16:25.857 に答える
11

カウントを確認するためにすばやくアクセスできるデータ構造が必要な場合は、カウンターを使用してみてください (@mgilson が指摘しているように、これは値自体がハッシュ可能であることに依存しています)。

>>> from collections import Counter
>>> d = {(1, 2): 2, (3, 1): 2, (4, 4): 1, (5, 6): 4}
>>> Counter(d.values())
Counter({2: 2, 1: 1, 4: 1})

次に、値をプラグインして、それが表示された回数を取得できます。

>>> c = Counter(d.values())
>>> c[2]
2
>>> c[4]
1
于 2012-11-19T21:17:46.477 に答える