web-dev-qa-db-ja.com

Python:キーが存在するかどうかを確認し、辞書から値を優先度の高い順に取得する方法

辞書があり、キーに基づいて値を取得したいです。たとえば、ユーザーの名、姓、ユーザー名、住所、年齢などの辞書があります。たとえば、1つの値(名前)のみを取得したい-姓、名、またはユーザー名のいずれかで、次のように優先度を降順にします。

(1)姓:キーが存在する場合、値を取得してチェックを停止します。そうでない場合は、次のキーに移動します。

(2)名:キーが存在する場合、値を取得してチェックを停止します。そうでない場合は、次のキーに移動します。

(3)ユーザー名:キーが存在する場合、値を取得するか、null /空を返します

#my dict looks something like this
myDict = {'age': ['value'], 'address': ['value1, value2'],
          'firstName': ['value'], 'lastName': ['']}

#List of keys I want to check in descending priority: lastName > firstName > userName
keySet = ['lastName', 'firstName', 'userName']

私がやろうとしたのは、可能なすべての値を取得してリストに入れ、リストの最初の要素を取得できるようにすることです。明らかにうまくいきませんでした。

tempList = []

for key in keys:
    get_value = myDict.get(key)
    tempList .append(get_value)

If elseブロックを使用せずにこれを行うより良い方法はありますか?

21
Cryssie

キーの数が少ない場合の1つのオプションは、連鎖取得を使用することです。

value = myDict.get('lastName', myDict.get('firstName', myDict.get('userName')))

ただし、keySetが定義されている場合、これはより明確になる可能性があります。

value = None
for key in keySet:
    if key in myDict:
        value = myDict[key]
        break

連鎖getsは短絡しないため、すべてのキーがチェックされますが、使用されるのは1つだけです。重要なキーが十分にある場合は、forループを使用します。

28
Peter DeGlopper

.get()を使用します。キーが見つからない場合は、Noneを返します。

for i in keySet:
    temp = myDict.get(i)
    if temp is not None:
        print temp
        break
13
TerryA

myDict.has_key(keyname)も使用して、キーが存在するかどうかを検証できます。

コメントに基づいて編集-

これは3.1より前のバージョンでのみ機能します。 has_keyはPython 3.1から削除されました。Python 3.1を使用している場合は、in演算子を使用する必要があります。

2
Nikhil Gupta

それを関数にカプセル化すると、再帰を使用して、関数に適切な名前を付けることで目的を明確に述べることができます(getAnyが実際に良い名前かどうかわかりません):

def getAny(dic, keys, default=None):
    return (keys or default) and dic.get(keys[0], 
                                         getAny( dic, keys[1:], default=default))

またはさらに良い、再帰せずに、より明確:

def getAny(dic, keys, default=None):
    for k in keys: 
        if k in dic:
           return dic[k]
    return default

次に、次のようなdict.getメソッドと同様の方法で使用できます。

getAny(myDict, keySet)

キーがまったく見つからない場合のデフォルト結果もあります:

getAny(myDict, keySet, "not found")
1
olivecoder