字典上的三元操作

时间:2012-12-03 20:17:09

标签: python dictionary conditional-operator

有没有办法在dict上进行三元运算,其中测试是has_key()而没有遇到键错误?即。

variable = dict["the_key"] if dict.has_key("the_key") else "something"

(这明显击中了关键错误)

如果失败了,那么根据一个可能会或可能没有问题的dict分配一堆变量值的最pythonic方法是什么?重复:

if dict.has_key('key'):
    value = dict['key']
else:
    value = "value"

ad adauseum似乎非常不优雅。

5 个答案:

答案 0 :(得分:11)

此:

mydict.get(key, default_value)

不会立即评估与default_value相同的100%,而仅在满足条件时评估else部分。

答案 1 :(得分:7)

Jochen Ritzel的答案是99.9999%的时间这样做的正确方法:

variable = d.get("the key", "something")

正如他所说,它不允许您短路评估默认值。你通常不在乎。它的默认值是"something",你当然不会。只有在生成默认值非常危险或非常昂贵时才重要。

只有在这种情况下,您才能并且应该使用您的想法。除了您需要in而不是has_key(因为它更具可读性,更快速且不被弃用):

variable = d["the key"] if "the key" in d else expensiveComputation()

然而,使用if语句而不是三元表达式可能是值得的,因为您避开expensiveComputation这一事实非常重要,并且您希望它更加明显:

if "the_key" in d:
    variable = d["the key"]
else:
    variable = expensiveComputation()

如果您认为默认情况很少见,那就更好了:

try:
    variable = d["the key"]
except KeyError:
    variable = expensiveComputation()

如果由于某种原因你需要避免两次查找密钥,而且你也无法处理异常,并且你需要立即将默认值短路:

sentinel = object()
variable = d.get(sentinel)
if variable == sentinel:
    variable = expensiveComputation()

是的,你可以把它全部包含在一个函数中,所以它是一个单行,但你几乎肯定不想隐瞒你一次做三件罕见事情的事实。

或者,当然,你可以这样做:

d = collections.defaultdict(expensiveComputation)

然后,它只是:

variable = d["the key"]

这会产生将d["the key"]设置为expensiveComputation()的副作用,然后再将其返回给您,因此稍后调用d["the key"]将返回相同的值。如果这听起来合适,这是最好的答案;如果你永远不会两次使用相同的密钥,或者这些东西是巨大的,浪费,等等,这是一个坏主意。

或者,您也可以覆盖dict.__missing__方法,而不是使用defaultdict

class MyDict(dict):
    def __missing__(self, key):
        return expensiveComputation()

然后,再次,它只是:

variable = d["the key"]

如果您希望每次单独生成值,并且不再保留以供日后使用,则此选项非常合适。

答案 2 :(得分:3)

使用.get()方法 - 如果密钥不存在,它将返回None,或者您可以设置自己的默认值:

http://docs.python.org/2/library/stdtypes.html#dict.get

value = mydict.get("key", "default")

答案 3 :(得分:1)

variable = d['the_key'] if 'the_key' in d else 'something'

答案 4 :(得分:0)

value = 'value'
if 'key' in dict:
   value = dict['key']

或定义默认值

  

dict.get('key','value')