Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 插入到字典中,如果键已存在而未进行两次哈希,则插入失败_Python_Python 3.x_Dictionary - Fatal编程技术网

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'))