【python】辞書でvalueを指定してkeyを取得する方法 & ソート

7月 10, 2020

辞書でvalueを指定してkeyを取得する関数

以下のコードをそのままコピーして下さい。「辞書には順番がない」と書かれているサイトもありますが、python3.6から辞書が順序を保証してくれるようになりました。そのため、以下のように辞書の順番を指定して、そのkeyやvalueを返すという処理が楽にできます。

def get_key_from_value(dictionary, value):
    """
    辞書でvalueを指定してkeyを取得する関数
    [0]とすることでlistではなく文字列としてreturnしている
    """
    return [key for key, value_ in dictionary.items() if value_ == value][0]


def main():
    dictionary = {"猿": "monkey", "鳥": "bird", "犬": "dog"}

    # keyを指定して、valueを取得する例
    value = dictionary["猿"]
    print(value)

    # valueを指定して、keyを取得する例
    key = get_key_from_value(dictionary, value="bird")
    print(key)


if __name__ == "__main__":
    main()

出力結果

monkey

辞書をソートする方法

def get_key_from_number(dictionary, number):
    return [key for i, (key, value) in enumerate(dictionary.items()) if i == number][0]


def main():
    # 元々の辞書
    dictionary = {"竹中半兵衛": 99, "太原雪斎": 96, "毛利元就": 100, "羽柴秀吉": 97,  "黒田官兵衛": 98}

    print("↓ keyを指定してvalueを取得する方法")
    print(dictionary["太原雪斎"])
    print("")
    print("↓ 辞書で要素の順番を指定してkeyを取得する方法")
    print(get_key_from_number(dictionary, 1))
    print("")
    print("↓ 辞書で要素の順番を指定してvalueを取得する方法")
    print(dictionary[get_key_from_number(dictionary, 1)])
    print("")
    print("↓ 単に辞書をソートするとタプルになってしまい、これでは使えない")
    dic2 = sorted(dictionary.items(), key=lambda x: x[1])
    print(dic2)
    print("")
    # そのため、以下のようにする
    print("↓ 新しい辞書にソートした辞書を入れるようにすると、ソードされた辞書ができる")
    dic3 = {}
    for k, value in sorted(dictionary.items(), key=lambda x: x[1]):
        dic3[k] = value
    print(dic3)
    print("")
    print("↓ 辞書を逆順にソートする場合")
    dic4 = {}
    for k, value in sorted(dictionary.items(), key=lambda x: -x[1]):
        dic4[k] = value
    print(dic4)


if __name__ == "__main__":
    main()

出力結果
↓ keyを指定してvalueを取得する方法
96

↓ 辞書で要素の順番を指定してkeyを取得する方法
太原雪斎

↓ 辞書で要素の順番を指定してvalueを取得する方法
96

↓ 単に辞書をソートするとタプルになってしまい、これでは使えない
[('太原雪斎’, 96), ('羽柴秀吉’, 97), ('黒田官兵衛’, 98), ('竹中半兵衛’, 99), ('毛利元就’, 100)]

↓ 新しい辞書にソートした辞書を入れるようにすると、ソードされた辞書ができる
{'太原雪斎’: 96, '羽柴秀吉’: 97, '黒田官兵衛’: 98, '竹中半兵衛’: 99, '毛利元就’: 100}

↓ 辞書を逆順にソートする場合
{'毛利元就’: 100, '竹中半兵衛’: 99, '黒田官兵衛’: 98, '羽柴秀吉’: 97, '太原雪斎’: 96}

辞書をソートする処理を関数にした場合

さて、辞書をソートするやり方が分かりました。次は、関数化してどこからでも利用出来るようにしましょう。以下のようになります。(クラス化までは必要なさそうに思います)

def get_key_from_number(dictionary, number):
    return [key for i, (key, _) in enumerate(dictionary.items()) if i == number][0]


def sort_dictionary(dictionary, reverse=False):
    dic = {}
    if reverse is False:
        for k, value in sorted(dictionary.items(), key=lambda x: x[1]):
            dic[k] = value
    else:
        for k, value in sorted(dictionary.items(), key=lambda x: -x[1]):
            dic[k] = value
    return dic


def main():
    dictionary = {"竹中半兵衛": 99, "太原雪斎": 96, "毛利元就": 100, "羽柴秀吉": 97,  "黒田官兵衛": 98}
    print("↓ keyを指定してvalueを取得する方法")
    print(dictionary["太原雪斎"])
    print("")
    print("↓ 辞書で要素の順番を指定してkeyを取得する方法")
    print(get_key_from_number(dictionary, 1))
    print("")
    print("↓ 辞書で要素の順番を指定してvalueを取得する方法")
    print(dictionary[get_key_from_number(dictionary, 1)])
    print("")
    print("↓ 単に辞書をソートするとタプルになってしまい、使えない")
    dic2 = sorted(dictionary.items(), key=lambda x: x[1])
    print(dic2)
    print("")
    # そのため、以下のようにする
    print("↓ 新しい辞書にソートした辞書を入れるようにすると、ソードされた辞書ができる")
    print(sort_dictionary(dictionary, reverse=False))
    print("")
    print("↓ 辞書を逆順にソートする場合")
    print(sort_dictionary(dictionary, reverse=True))


if __name__ == "__main__":
    main()

実行結果は上と一緒です。

辞書とは

pythonでは辞書といいますが、他の言語では連想配列やハッシュなどと言います。通常辞書は、keyからvalueを取得することを前提に作られているので、valueからkeyを取得するのは難しかったりします。しかし、pythonでは上のようにすればvalueからkeyを取得することが出来ます。

csvファイルから辞書を作成する

辞書の数が多くなると、コードの中で辞書を作成していると、管理が大変になってきます。そこで、csvファイルを読み取って辞書を作成するという方法が考えられます。
〜省略〜