[英]Initialize non existing keys in OrderedDict with default values like defaultDict
有什么方法可以使用默认值访问 OrderedDict 中不存在的键,就像我们在 defaultDict 中所做的那样
Ex.
od = OrderedDict({'a':1})
print(od['b']) # Output: KeyError: 'b'
这是在下面的实现中抛出KeyError
的真正问题
l =['a','b','c','b']
od = OrderedDict({})
for k in l:
od[k] += 1 # KeyError
有意避免这种实现
for k in l:
if k in od:
od[k] += 1
else:
od[k] = 1
只需从OrderedDict
继承并重新定义__getitem__
:
from collections import OrderedDict
class OrderedDictFailFree(OrderedDict):
def __getitem__(self, name):
try:
return OrderedDict.__getitem__(self, name)
except KeyError:
return None
od = OrderedDictFailFree({'a': 1})
print(od['b'])
例如,如果您正在寻找 0 作为任何不存在的键的默认值。 如果键是预定义的,那么您可以使用 setdefault()
from collections import defaultdict
od = defaultdict(lambda: 0, od )
正如Yevgeniy Kosmak 的回答所示,这当然是可行的。 但是,请记住,在 Python >=3.7(或者甚至 >=3.6,只要您使用默认的 CPython 实现)中,所有字典现在都保持插入顺序。 因此,如果您不需要与旧版本兼容,通常根本不需要使用 OrderedDict。 您可以简单地使用 defaultdict,它会始终保持其键的顺序。
看起来我们可以使用od.setdefault('b',0)
虽然它不是那么优雅的解决方案。
od = OrderedDict({'a':1})
print(od.setdefault('b',0)) # od.get('b',0) could be used if intention is not to change od
l =['a','b','c','b','b']
od = OrderedDict({})
for k in l:
od[k] = od.setdefault(k,0) + 1 # set key to 0 if there in no key k and increment by 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.