10

これは当たり前のことのように思えて、何かを見落としているように感じますが、同じディクショナリ内の 2 つの異なるキーがまったく同じ値を持っているかどうかを調べるにはどうすればよいでしょうか? たとえばtest、キーab、およびcキーを持つディクショナリがaあり、b両方の値が 10 である場合、どのようにそれを把握しますか? (質問の要点として、100などの多数のキーを想定してください。重複がいくつあるか、重複のセットが複数ある場合、または重複がまったくない場合)。ありがとう。

4

7 に答える 7

8
len(dictionary.values()) == len(set(dictionary.values()))

これは、あなたが知りたい唯一のことは、どの値が重複しているかではなく、重複する値があるかどうかであるという仮定の下にあり、これは私があなたの質問から推測したものです。質問を誤解した場合はお知らせください。

基本的に、これは、辞書の値が、定義上重複がないオブジェクトにキャストされたときに、エントリが削除されたかどうかを確認するだけです。

上記が目的に合わない場合は、これがより良い解決策になるはずです:

set(k for k,v in d.items() if d.values().count(v) > 1))

基本的に、2 番目のバージョンは、リストからポップアウトしようとした場合に削除されるエントリが複数あるかどうかを確認するだけです。

于 2013-07-23T21:12:23.180 に答える
7

これらすべてのケースを検出するには:

>>> import collections
>>> d = {"a": 10, "b": 15, "c": 10}
>>> value_to_key = collections.defaultdict(list)
>>> for k, v in d.iteritems():
...     value_to_key[v].append(k)
...
>>> value_to_key
defaultdict(<type 'list'>, {10: ['a', 'c'], 15: ['b']})

@hivert は、値がハッシュ可能である場合にのみ機能するという優れた点を示しています。そうでない場合、(悲しいことに) O(n) の優れたソリューションはありません。これは私が思いつくことができる最高のものです:

d = {"a": [10, 15], "b": [10, 20], "c": [10, 15]}
values = []
for k, v in d.iteritems():
    must_insert = True
    for val in values:
        if val[0] == v:
            val[1].append(k)
            must_insert = False
            break
    if must_insert: values.append([v, [k]])

print [v for v in values if len(v[1]) > 1] #prints [[[10, 15], ['a', 'c']]]
于 2013-07-23T21:08:26.197 に答える
3
dico = {'a':0, 'b':0, 'c':1}
result = {}
for val in dico:
    if dico[val] in result:
        result[dico[val]].append(val)
    else:
        result[dico[val]] = [val]
>>> result
{0: ['a', 'b'], 1: ['c']}

次に、複数の要素を持つ値 (リスト) を持つ結果のキーをフィルタリングできます。たとえば、重複が見つかりました。

于 2013-07-23T21:18:22.170 に答える
1

最初の dict の値をその値を保持するすべてのキーにマッピングする別の dict を作成します。

import collections

inverse_dict = collections.defaultdict(list)
for key in original_dict:
    inverse_dict[original_dict[key]].append(key)
于 2013-07-23T21:12:34.543 に答える