Python で辞書のキーと値を入れ替える

Rayven Esplanada 2023年1月30日
  1. Python で items() を使用して辞書を逆にする
  2. collections.defaultdict() を使って Python で辞書を反転させる
Python で辞書のキーと値を入れ替える

この記事では、Python の辞書のキーと値を入れ替える方法を紹介します。

辞書の入れ替えすることはリストの逆にすることとは異なりマス。つまり、辞書のキーと値を入り替え、開発者が使用する目的に合わせてそれらを交換することを意味します。

Python で items() を使用して辞書を逆にする

Python の辞書には items() という組み込み関数があり、これは辞書のキーと値のペアをタプル形式で表示する反復可能なオブジェクトを返します。

例えば、ランダムなカテゴリの辞書を宣言し、items() を使ってそれを出力します。

dct = {
    "Animal": "Dog",
    "Fruit": "Pear",
    "Vegetable": "Cabbage",
    "Tree": "Maple",
    "Flower": "Daisy",
}

print(dct.items())

出力:

dict_items([('Animal', 'Dog'), ('Fruit', 'Pear'), ('Vegetable', 'Cabbage'), ('Tree', 'Maple'), ('Flower', 'Daisy')])

辞書を items() で出力すると、タプル値の反復可能なリストが出力されます。

items() の結果をループさせ、キーと値を入れ替えることで、キーと値のペアを反転させることができます。

dct = {v: k for k, v in dct.items()}
print(dct)

for ループの kv はそれぞれキーと値を表します。前の値 v を新しいキー、前のキー k を新しい値に設定しているが、v: k は各反復におけるキーと値のプレースホルダです。

出力:

{'Dog': 'Animal', 'Pear': 'Fruit', 'Cabbage': 'Vegetable', 'Maple': 'Tree', 'Daisy': 'Flower'}

これで、出力ではキーと値の要素が逆になりました。

逆辞書の同じ値のキー

辞書を入れ替えるときの別の例のシナリオは、同じ値を持つ複数のキーまたは値がある場合です。これは、辞書を反転させる可能性が高いシナリオです。

例えば、人々の好きな動物の辞書。

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

上記のコードを使用して辞書を反転した場合、出力は期待したようなものではありません。

favAnimal = {v: k for k, v in favAnimal.items()}
print(favAnimal)

出力:

{'Dog': 'James', 'Cat': 'Jane', 'Lion': 'Jerome', 'Giraffe': 'Jared'}

ここでは、ループ内でキーや値が繰り返されるたびに既存のレコードが上書きされるため、元の辞書から 2つの要素が欠落しています。

辞書には、値のペア Dog を持つ 3 人の人が含まれていますが、James だけがコピーされています。

この問題を解決するには、値をリストに格納して単一のキーに割り当てる必要があります。

完全な例のコード。

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

favAnimal = {v: k for k, v in favAnimal.items()}

print(favAnimal)

collections.defaultdict() を使って Python で辞書を反転させる

モジュール collections には、Python の辞書の値を操作するための関数 defaultdict() があります。

defaultdict() は主に存在しないキーのデフォルト値を作成するために利用されます。存在しないキーにアクセスした場合、存在しないキーであってもデフォルト値を宣言することができます。

この関数は、リストデータ型の値を持つ新しい辞書を作成したい場合に便利です。

同じ例の favAnimal を用いて、辞書を逆にし、値をリストに変換します。

まず、defaultdict() を用いて新しい辞書を初期化します。

from collections import defaultdict

favAnimal_inverted = defaultdict(list)

次に、リスト内包表記を用いて反転を行い、反転した値を新しい辞書に格納します。

{favAnimal_inverted[v].append(k) for k, v in favAnimal.items()}

最後に、defaultdict() は辞書のサブクラスのようなものを生成するので、これを dict() でラップして基底辞書型に変換します。

result = dict(favAnimal_inverted)
print(result)

出力:

{'Dog': ['John', 'Jenny', 'James'], 'Cat': ['Jane'], 'Lion': ['Jerome'], 'Giraffe': ['Jared']}

John、Jenny、James はこれで、他の要素が Dog を値として持つ最後の要素に上書きされる代わりに、キー Dog を持つ同じリストになりました。

完全なサンプルコード:

from collections import defaultdict

favAnimal_inverted = defaultdict(list)
result = dict(favAnimal_inverted)
print(result)

要約すると、items() を使用して辞書をループさせ、キーと値を入れ替えます。もしもデータセットが重複している可能性がある場合は、defaultdict() を用いて値をリストに変換し、既存の値を置き換えるのではなく、辞書の値がリストに追加されるように操作してください。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

関連記事 - Python Dictionary