python字典的默认行为是在字典中创建新密钥(如果该密钥尚不存在)。例如:
d = {}
d['did not exist before'] = 'now it does'
这对于大多数用途来说都很好,但是如果键不在字典中,我希望python什么也不做。在我的情况下:
for x in exceptions:
if masterlist.has_key(x):
masterlist[x] = False
换句话说,我不希望在例外中有一些不正确的元素来破坏我的主列表。这样简单吗? FEELS 就像我应该能够在for循环中的一行中做到这一点(即,没有明确地检查x是主列表的关键字)
更新: 对我来说,我的问题是询问列表与字典之间缺乏平行关系。例如:
l = []
l[0] = 2 #fails
l.append(2) #works
使用子类化答案,你可以修改字典(可能是“safe_dict”或“explicit_dict”来做类似的事情:
d = {}
d['a'] = '1' #would fail in my world
d.insert('a','1') #what my world is missing
答案 0 :(得分:15)
您可以使用.update
:
masterlist.update((x, False) for x in exceptions if masterlist.has_key(x))
答案 1 :(得分:10)
你可以继承一个dict
类,覆盖它的__setitem__
来检查密钥是否存在(或者只对一个实例进行猴子修补)。
示例类:
class a(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
dict.__setitem__(self, 'a', 'b')
def __setitem__(self, key, value):
if self.has_key(key):
dict.__setitem__(self, key, value)
a = a()
print a['a'] # prints 'b'
a['c'] = 'd'
# print a['c'] - would fail
a['a'] = 'e'
print a['a'] # prints 'e'
您也可以使用某些功能来设置值而不检查是否存在更简单 但是,我会更短......除非你在很多地方需要它,否则不要使用它。
答案 2 :(得分:3)
您也可以使用in
代替has_key
,这样会更好。
for x in exceptions:
if x in masterlist:
masterlist[x] = False
但是我没有看到为此目的发出if
声明的问题。
答案 3 :(得分:1)
对于长列表,请尝试使用&
运算符set()
包含()
:
for x in (set(exceptions) & set(masterlist)):
masterlist[x] = False
#or masterlist[x] = exceptions[x]
通过只读一次主列表的键,它可以同时改善读数和迭代次数。