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

辞書で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ファイルを読み取って辞書を作成するという方法が考えられます。
〜省略〜
