24

重複の可能性:
逆辞書検索 - Python
を使用した辞書の Python 逆マッピング

辞書のインデックスのキーを取得するにはどうすればよいですか?

たとえば、次のようにします。

i = {'a': 0, 'b': 1, 'c': 2}

したがって、i[0] のキーを取得したい場合は、「a」が返されます

4

3 に答える 3

29

次のようなことができます。

i={'foo':'bar', 'baz':'huh?'}
keys=i.keys()  #in python 3, you'll need `list(i.keys())`
values=i.values()
print keys[values.index("bar")]  #'foo'

ただし、辞書を変更するたびに、キーと値を更新する必要があります。これは、3.7 より前のバージョンの Python では辞書が順序付けられていないためです。これらのバージョンでは、新しいキーと値のペアを挿入するたびに、想定していた順序がなくなり、新しい (多かれ少なかれランダムな) 順序に置き換えられます。したがって、辞書のインデックスを求めることは意味がありません。

Python 3.6 以降、Python の CPython 実装では、辞書は挿入された項目の順序を記憶しています。Python 3.7 以降では、辞書は挿入順に並べられています。

また、あなたが求めていることは、おそらくあなたが実際に望んでいるものではないことに注意してください。ディクショナリ内の逆マッピングが一意であるという保証はありません。つまり、次の辞書を使用できます。

d={'i':1, 'j':1}

その場合、あなたが望むかどうかを知ることは不可能でiありj、実際にはここでの答えはどちら ('i'または'j') が選択されるかを伝えることはできません (辞書は順序付けられていないため)。その状況で何がしたいですか?受け入れ可能なキーのリストを取得できます...しかし、辞書に関するあなたの基本的な理解は正しくないと思います。

于 2012-07-24T14:23:12.267 に答える
20

Python辞書にはキーと値があります。あなたが求めているのは、特定の値を指すキーです。

これはループでのみ実行できます。

[k for (k, v) in i.iteritems() if v == 0]

dictの値ごとに複数のキーが存在する可能性があることに注意してください。{'a': 0, 'b': 0}完全に合法です。

順序付けが必要な場合は、代わりにリストまたはOrderedDictインスタンスを使用する必要があります。

items = ['a', 'b', 'c']
items.index('a') # gives 0
items[0]         # gives 'a'
于 2012-07-24T14:23:02.190 に答える
6

定義上、辞書は順序付けられていないため、索引付けできません。そのような機能については、順序付けられた辞書を使用してください。Python順序付き辞書

于 2012-07-24T14:22:56.730 に答える