我有一本字典。每个键以两种方式之一表示:短和长。我想获得一些键的值。我可以这样做:
d = dict(....)
a = d["a"] or d["aaa"]
b = d["b"] or d["bbb"]
但是当密钥“a
”不存在时会抛出异常,因此即使d["aaa"]
没有,它也不会调用d["a"]
。我知道,它可以很容易地解决,但我怎么能以优雅的方式做到这一点?
答案 0 :(得分:2)
你可以使用dict.get:
a = d.get("a", d.get("aaa"))
b = d.get("b", d.get("bbb"))
但请注意,即使存在"aaa"
和"bbb"
,也会查找"a"
和"b"
。
这也有效(因为or
适用于None
和str
等。)
a = d.get("a") or d.get("aaa")
如果第一个成功,则不会进行第二次查找。
请注意,如果None
是与您的词典中某个键相关联的可能值,则此功能无效。
正如@TimPietzcker所指出的,如果你没有None
作为可能的值,你可以这样做:
a = d.get("a") or d["aaa"]
如果两个键都不存在则获得异常。
答案 1 :(得分:2)
如果您经常使用这样的结构,您可以使用类似于此的小dict
包装器:
class altdict(dict):
def __getitem__(self, item):
if isinstance(item, (tuple, list)):
for p in item:
try:
return self[p]
except KeyError:
pass
raise KeyError, item
return dict.__getitem__(self, item)
然后
d = altdict({
'a' :'aaa!',
'bbb' :'bbb!',
})
print d['a', 'aaa'] # aaa!
print d['b', 'bbb'] # bbb!
print d['c', 'ccc'] # KeyError
请注意,这适用于" alternate"的任意列表。键:
d['B', 'Bill', 'William'] # pretty nice
虽然.get
解决方案会很快变成噩梦:
d.get('a', d.get('b', d.get('c'))) # wtf?
答案 2 :(得分:1)
您可以使用字典的get方法并提供默认值:
d.get(" a",无)
如果" a"这将返回d [" a"]是一键或否则是