有没有办法将新密钥插入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__
被调用了两次,而且这段代码并没有表达所谓的插入或失败的原子操作行为。
答案 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