次のような辞書があるとします。
my_dict = {2:3, 5:6, 8:9}
キーと値を切り替えて取得する方法はありますか?
{3:2, 6:5, 9:8}
my_dict2 = dict((y,x) for x,y in my_dict.iteritems())
python 2.7または3.xを使用している場合は、代わりに辞書内包表記を使用できます。
my_dict2 = {y:x for x,y in my_dict.iteritems()}
編集
JBernardoのコメントに記載されているように、python 3.xの場合、items
の代わりにiteritems
を使用する必要があります
これを試して:
my_dict = {2:3, 5:6, 8:9}
new_dict = {}
for k, v in my_dict.items():
new_dict[v] = k
Pythonの逆/マッピングの反転 で受け入れられた回答からこのコード(簡単に変更)を使用します。
dict((v,k) for k, v in my_dict.iteritems())
これは、元の辞書の値が一意であることを前提としていることに注意してください。そうしないと、結果のディクショナリでキーが重複することになり、それは許可されません。
また、@ wimが指摘しているように、値がハッシュ可能であることも想定しています。 Python用語集 を参照してください。何がハッシュ可能かどうかわからない場合。
多分:
flipped_dict = dict(Zip(my_dict.values(), my_dict.keys()))
値がすべて一意であるという条件が満たされない場合があります。その場合、上記の回答は重複する値を破棄します。
以下は、重複する可能性のある値をリストにロールアップします。
from itertools import count
dict([(a,[list(d.keys())[i] for i,j in Zip(count(), d.values())if j==a in set(d.values())])
より良い(非リストコンプ)メソッドがあると確信していますが、以前の回答には問題があったので、他のユーザーが同様のユースケースを持っている場合にソリューションを提供すると思いました。
追伸オリジナルに変更を加えた後も、辞書がきちんと整理されたままになるとは思わないでください!このメソッドは静的辞書でのみ使用されます-警告されました!
次のようにできます:
関数:
def inverse_dict(my_dict):
updated_dict = {}
for i in my_dict:
updated_dict[my_dict[i]] = [i]
return updated_dict
メイン():
def main():
year = {'day': 15, 'month': 3, 'year': 2019}
print(inverse_dict(year))
if __== "__main__":
main()
出力:
{15: ['day'], 3: ['month'], 2019: ['year']}
値が一意でない場合、変換時にキースペースと衝突します。場所を切り替えるときにキーをリストに保持することをお勧めします
以下がこれを処理します-
RvsD = dict()
for k,v in MyDict.iteritems():
RsvD.setdefault(v, []).append(k)
まず第一に、辞書の値はハッシュできないため、これが可能であることが保証されていますnotです。
そうでない場合は、次の機能的アプローチを使用できます。
reversed_dict = dict(map(reversed, original_dict.items()))
my_dict = { my_dict[k]:k for k in my_dict}
ディクショナリ内で値が一意でない場合、キーをその値にマップできます。ここでdefaultdictを使用してそれを行う方法の例
from collections import defaultdict
def reverse_dict(data: dict) -> dict:
rd = defaultdict(list)
for k, v in data.items():
rd[v].append(k)
return rd
if __== "__main__":
from collections import Counter
data = "aaa bbb ccc ddd aaa bbb ccc aaa"
c = Counter(data.split())
print(c)
# Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
rd = reverse_dict(c)
print(rd)
# defaultdict(<class 'list'>, {3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd']})