插入python字典

时间:2011-06-23 15:35:09

标签: python dictionary

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

4 个答案:

答案 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]

通过只读一次主列表的键,它可以同时改善读数和迭代次数。