python tips:作为dict的key的类

Python的dict由hash实现,解决hash冲突的方法是二次探查法。hash值相同的元素会形成链表。所以dict在查找key时,首先获取hash值,直接得到链表的表头;而后在链表中查找等于key的值。

所以要使一个对象的实例能够作为dict的key值,一般需要实现__hash__和__eq__两个方法。

没有实现__eq__方法的类的实例总是不相等(引用总是不同)

 1 class A:
 2     def __hash__(self):
 3         return 2
 4
 5 a = A()
 6 b = A()
 7 d = {a:0}
 8 if b in d:
 9     print(d[b])
10 else:
11     print("b is not in d")

输出结果

1 b is not in d

可以用于key的实例

 1 class A:
 2     def __hash__(self):
 3         return 2
 4
 5     def __eq__(self, other):
 6         return True
 7
 8 a = A()
 9 b = A()
10 d = {a:0}
11 if b in d:
12     print(d[b])
13 else:
14     print("b is not in d")

输出结果

1 0

总结:

1. 要作为dict的key,需要能够求hash值(key为不可变对象),需要能比较(是否相等)

2. 对于类来说,实例求hash需要实现__hash__,比较是否相等需要实现__eq__(默认比较引用,不同实例的引用总是不同)

原文地址:https://www.cnblogs.com/luoheng23/p/11018813.html

时间: 2024-07-31 19:53:06

python tips:作为dict的key的类的相关文章

python入门七(迭代)【9-3 python之迭代dict的value和key】

9-3 python之迭代dict的value和key 我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的. 首先,我们看看 dict 对象的 items() 方法返回的值: >>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } >>> print d.items() [('Lisa', 85), ('Adam', 95), ('Bart', 59)]

[转]30 ESSENTIAL PYTHON TIPS AND TRICKS FOR PROGRAMMERS

If you ask any Python programmer to tell about the strengths of Python, he will quote brevity and high readability as the most influencing ones. In this Python tutorial, we’ll cover many essential Python tips and tricks that will authenticate the abo

python iter,迭代器&dict,字典详解

可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. 迭代器为类序列对象提供了一个类序列的接口.python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象.迭代器用起来很灵巧,你可以迭代不是序列但表现处序列行为的对象,例如字典的键.一个文件的行,等等.迭代器的作用如下: >>>

Python学习——使用dict和set

dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list: names = ['Michael', 'Bob', 'Tracy'] scores = [95, 75, 85] 给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长. 如

《python源码剖析》笔记 python中的Dict对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyDictObject对象 -->  C++ STL中的map是基于RB-tree的,搜索时间复杂度是O(logN) PyDictObject采用了hash表,时间复杂度是O(1) typedef struct{ Py_ssize_t me_hash; //me_key的hash值,避免每次查询都要重新计算一遍hash值 PyObject *me_key; PyObject *me_

Python 基础之dict和set

注意:返回None的时候Python的交互式命令行不显示结果. 要删除一个key,用pop(key)方法,对应的value也会从dict中删除: >>> d.pop('Bob') 75 >>> d {'Michael': 95, 'Tracy': 85} 请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的. 和list比较,dict有以下几个特点: 查找和插入的速度极快,不会随着key的增加而变慢: 需要占用大量的内存,内存浪费多. 而list相反: 查找

Python基础day-4[dict,set,bool]

布尔类型: True和False 所有的数据类型自带布尔值,只有0,None,空的布尔值为False 字典dict: 特性:dict中使用key和对应的value来存储数据,dict不像 list那样,数据越多查询越慢.dict中key必须是不可变类型,或者说必须是可hash类型.value的值是可以改变的,可以是任意类型的数据.字典的取值是无序的.无法通过索引取值. 定义dict: d = {key:value,key:value,key:value} d = {'name':'abc','a

Python学习笔记 - dict和set

dict #!/usr/bin/env python3 # -*- coding: utf-8 -*- #dict >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95 >>> d['Adam'] = 67 >>> d['Adam'] 67 >>> d['Jack'] = 90 >>> d['Jack'] 90 >

Python中的dict

# dict # Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} print('dict get Michael:', d['Michael']) # add a element d['Adam'] = 67 print('dict d', d) # change a element d['Adam