如果密钥已经存在而没有散列两次,则插入字典或失败

时间:2016-03-02 11:17:50

标签: python python-3.x dictionary

有没有办法将新密钥插入dict,或者如果该密钥已经存在而没有两次散列,则会失败?

从这样的事情:

class MyClass:
    def __init__(self):
        pass

    def __hash__(self):
        print('MyClass.__hash__ called')
        return object.__hash__(self)

my_key = MyClass()
my_value = "my_string"
my_dict = {}
if my_key not in my_dict:
    my_dict[my_key] = my_value
else:
    raise ValueError

你可以看到__hash__被调用了两次,而且这段代码并没有表达所谓的插入或失败的原子操作行为。

4 个答案:

答案 0 :(得分:6)

my_dict.setdefault(my_key, my_value)
  

setdefault(key[, default])
  如果key在字典中,则返回其值。如果不是,请插入值为default的值并返回default。默认默认为None

答案 1 :(得分:4)

使用字典的setdefault方法:

if my_dict.setdefault(my_key, my_value) != my_value:
     raise ValueError

setdefault将第二个参数分配给第一个参数给出的键,但前提是键不存在于字典中。在任何情况下,它都会返回字典中的值(因此,如果没有旧值,则为原始值或新的默认值)。

我的代码检查返回值以查看字典是否具有my_value以外的值。它将无法检测到在同一个密钥下添加两次的相同值。我认为没有哈希两次处理这种情况的方法。

答案 2 :(得分:0)

使用方法包含(键)

my_dictionary = {"a":1, "b":2}
print(my_dictionary.__contains__('a'))
print(my_dictionary.__contains__('b'))
print(my_dictionary.__contains__('c'))

答案 3 :(得分:0)

将散列键存储在变量中怎么样?

class MyClass:
    def __init__(self):
        pass

    def __hash__(self):
        print('MyClass.__hash__ called')
        return object.__hash__(self)

my_key = MyClass()
my_value = "my_string"
my_dict = {}

hashed_key = my_key.__hash__()

if hashed_key not in my_dict:
    my_dict[hashed_key] = my_value
else:
    raise ValueError 

给予

MyClass.__hash__ called