web-dev-qa-db-ja.com

pythonで辞書のキーと値を切り替える

次のような辞書があるとします。

my_dict = {2:3, 5:6, 8:9}

キーと値を切り替えて取得する方法はありますか?

{3:2, 6:5, 9:8}
41
me45
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を使用する必要があります

71
GWW

これを試して:

my_dict = {2:3, 5:6, 8:9}

new_dict = {}
for k, v in my_dict.items():
    new_dict[v] = k
6
Óscar López

Pythonの逆/マッピングの反転 で受け入れられた回答からこのコード(簡単に変更)を使用します。

dict((v,k) for k, v in my_dict.iteritems())

これは、元の辞書の値が一意であることを前提としていることに注意してください。そうしないと、結果のディクショナリでキーが重複することになり、それは許可されません。

また、@ wimが指摘しているように、値がハッシュ可能であることも想定しています。 Python用語集 を参照してください。何がハッシュ可能かどうかわからない場合。

6
Trott

多分:

flipped_dict = dict(Zip(my_dict.values(), my_dict.keys()))

5
aaron

値がすべて一意であるという条件が満たされない場合があります。その場合、上記の回答は重複する値を破棄します。

以下は、重複する可能性のある値をリストにロールアップします。

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())])

より良い(非リストコンプ)メソッドがあると確信していますが、以前の回答には問題があったので、他のユーザーが同様のユースケースを持っている場合にソリューションを提供すると思いました。

追伸オリジナルに変更を加えた後も、辞書がきちんと整理されたままになるとは思わないでください!このメソッドは静的辞書でのみ使用されます-警告されました!

2
Thomas Kimber

次のようにできます:

関数:

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']}
1
Alon Eilat

値が一意でない場合、変換時にキースペースと衝突します。場所を切り替えるときにキーをリストに保持することをお勧めします

以下がこれを処理します-

RvsD = dict()
for k,v in MyDict.iteritems():
    RsvD.setdefault(v, []).append(k)
1
mungayree

まず第一に、辞書の値はハッシュできないため、これが可能であることが保証されていますnotです。

そうでない場合は、次の機能的アプローチを使用できます。

reversed_dict = dict(map(reversed, original_dict.items()))
1
my_dict = { my_dict[k]:k for k in my_dict}
1
VladEg

ディクショナリ内で値が一意でない場合、キーをその値にマップできます。ここで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']})
0
Vlad Bezden