Pythonの辞書型についてのTIPS

2022年5月12日dict,Programing,Python

Pythonの辞書型についてのあれこれメモ代わりのTIPS

Keyが存在しない場合のエラーを回避(getメソッド)

dictに存在しないKeyを指定して値を取ろうとするとエラーになります。

test = {"A":"a", "B":"b", "C":"c"}

a = test["AA"]
Traceback (most recent call last):
  File "Main.py", line 6, in <module>
    a = test["AA"]
KeyError: 'AA'

getメソッドを使うとKeyがない場合でもエラーにならなくなる。
第1引数はKeyで、第2引数はKeyが存在しなかった場合に代入される任意の値になります。指定しないとNoneになります。

test = {"A":"a", "B":"b", "C":"c"}

a = test.get("AA")
b = test.get("AA", "Key is not fount")

print(a)
print(b)
None
Key is not fount

複数の値を、複数の変数に一度に代入(分割代入)

辞書型で格納されている様々な値を変数に代入したいとき、例えばこんな感じで取るわけですが

test = {"A":"a", "B":"b", "C":"c"}

a = test["A"]
b = test["B"]
c = test["C"]

これを1行で収めたいっていうときに使う方法

from operator import itemgetter

test = {"A":"a", "B":"b", "C":"c"}

a, b, c = itemgetter("A","B","C")(test)

こうするだけで1行で書けちゃう。
ただ、このやり方だと存在しないKeyを指定するとエラーになる。
dictのgetメソッドのようなことはできない
その代わり、Keyの順番とかも気にせず好きなように引っ張ってこれるので少しだけソースがスッキリする。

dictの中身をKeyでソートする

test = {"D":"d", "C":"c", "B":"b", "A":"a"}
test_list = sorted(test.items(), key=lambda x: x[0])
test.clear()
test.update(test_list)

print(test)
{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}

dictをitemsでlistとしてソートし、dictに直している。

dictのリストを値でソートする

from operator import itemgetter

dict_list = [
    {
        "name": "Tom",
        "age": 20
    },
    {
        "name": "Tom",
        "age": 10
    },
    {
        "name": "Bob",
        "age": 19
    },
]
dict_list = sorted(dict_list, key=itemgetter("name"))

print(dict_list)
[{'name': 'Bob', 'age': 19}, {'name': 'Tom', 'age': 20}, {'name': 'Tom', 'age': 10}]

operator.itemgetterを使って、dictのlistを特定のKeyの値でソートしている。
itemgetterの引数には複数のKeyを指定でき、ソートの優先順位に対応する。

from operator import itemgetter

dict_list = [
    {
        "name": "Tom",
        "age": 20
    },
    {
        "name": "Tom",
        "age": 10
    },
    {
        "name": "Bob",
        "age": 19
    },
]
dict_list = sorted(dict_list, key=itemgetter("name", "age"))

print(dict_list)
[{'name': 'Bob', 'age': 19}, {'name': 'Tom', 'age': 10}, {'name': 'Tom', 'age': 20}]

この例ではnameでソートしているが、nameが同値の場合はageでソートされるようになる。