Python 插入到字典中,如果键已存在而未进行两次哈希,则插入失败
有没有一种方法可以将一个新密钥插入到Python 插入到字典中,如果键已存在而未进行两次哈希,则插入失败,python,python-3.x,dictionary,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 = "m
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
您可以看到,\uuuuuu hash\uuuuu
被调用了两次,并且该代码没有将所需的插入或失败行为表示为原子操作
my_dict.setdefault(my_key, my_value)
如果键在字典中,则返回其值。如果不是,则插入值为default的键并返回default。默认值为
None
使用字典的
setdefault
方法:
if my_dict.setdefault(my_key, my_value) != my_value:
raise ValueError
setdefault
将第二个参数指定给第一个参数给定的键,但前提是该键在字典中不存在。在任何情况下,它都会返回字典中的值(因此要么返回原始值,要么返回新的默认值(如果没有旧值)
My code检查返回值,查看字典中是否有除My_值
以外的值。它将无法检测到在同一密钥下添加两次相同的值。我认为没有一种方法可以在不进行两次哈希运算的情况下处理这种情况。使用方法包含(key)
真的
真的
False请注意,您试图解决的问题(避免调用
\uuuuuu散列\uuuuuuu
两次)可能不是您应该解决的问题。你的散列函数应该足够快,以至于你不在乎它被调用的频率。如果不是这样,你可能是在浪费时间使用字典,而不是其他一些查找成本更高的数据结构,因为字典的“快速”查找实际上不会很快。这取决于你想要什么行为,但只要命名了my_值
,我认为不是,而不是=
在这里通常是有意义的。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
是我在示例中使用的表达式中的中的函数调用。另外,问题被标记为python3
,您已经发布了python2
@praxelitic,添加了缺少的括号,这使得它不是python3。可以将打印中的整个表达式用作if条件的布尔值。我看不出“in”在图片中的位置
my_dictionary = {"a":1, "b":2}
print(my_dictionary.__contains__('a'))
print(my_dictionary.__contains__('b'))
print(my_dictionary.__contains__('c'))