有没有办法在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似乎非常不优雅。
答案 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')