通过2个键中的一个获取值

时间:2014-09-22 08:08:11

标签: python

我有一本字典。每个键以两种方式之一表示:短和长。我想获得一些键的值。我可以这样做:

d = dict(....)
a = d["a"] or d["aaa"]
b = d["b"] or d["bbb"]

但是当密钥“a”不存在时会抛出异常,因此即使d["aaa"]没有,它也不会调用d["a"]。我知道,它可以很容易地解决,但我怎么能以优雅的方式做到这一点?

3 个答案:

答案 0 :(得分:2)

你可以使用dict.get:

a = d.get("a", d.get("aaa"))
b = d.get("b", d.get("bbb"))

但请注意,即使存在"aaa""bbb",也会查找"a""b"

这也有效(因为or适用于Nonestr等。)

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"]是一键或否则是