辞書があり、キーに基づいて値を取得したいです。たとえば、ユーザーの名、姓、ユーザー名、住所、年齢などの辞書があります。たとえば、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ブロックを使用せずにこれを行うより良い方法はありますか?
キーの数が少ない場合の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
連鎖get
sは短絡しないため、すべてのキーがチェックされますが、使用されるのは1つだけです。重要なキーが十分にある場合は、for
ループを使用します。
.get()
を使用します。キーが見つからない場合は、None
を返します。
for i in keySet:
temp = myDict.get(i)
if temp is not None:
print temp
break
myDict.has_key(keyname)
も使用して、キーが存在するかどうかを検証できます。
これは3.1より前のバージョンでのみ機能します。 has_key
はPython 3.1から削除されました。Python 3.1を使用している場合は、in
演算子を使用する必要があります。
それを関数にカプセル化すると、再帰を使用して、関数に適切な名前を付けることで目的を明確に述べることができます(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")