python set dict实现原理和常用数据结构方法分析
Python数据结构总结
dict与set的实现原理
两者的原理都是哈希表。
dict与set实现原理是一样的,都是将实际的值放到list中。唯一不同的在于hash函数操作的对象,对于dict,hash函数操作的是其key,而对于set是直接操作的它的元素,假设操作内容为x,其作为因变量,放入hash函数,通过运算后取list的余数,转化为一个list的下标,此下标位置对于set而言用来放其本身,而对于dict则是创建了两个list,一个list该下表放此key,另一个list中该下标方对应的value。
其中,我们把实现set的方式叫做Hash Set,实现dict的方式叫做Hash Map/Table(注:map指的就是通过key来寻找value的过程)。
下面是常用数据结构和时间复杂度分析。
string
不可变。
方法 | 解释 |
---|---|
str.count(‘a’) | 返回str中字符a的个数 |
str.lower() | 返回str的小写形式 |
str.upper() | 返回str的大写形式 |
str.strip() | 去除str首尾\n和空白字符,也可取任意字符 |
str.replace(‘a’, ‘z’) | 替换全部a为z |
str.find(‘a’) | 返回str中第一个a的位置下标 |
str.ljust(10, ‘0’) | 输出str左对齐,右边补字符0,共10位 |
str.rjust(10, ‘0’) | 输出str右对齐,左边补字符0,共10位 |
list
可变。
方法 | 解释 | 时间复杂度 |
---|---|---|
l.append(30) | 末尾添加30 | O(1) |
l.extend([30, 40, 50]) | 合并一个列表到l尾部 | |
l.pop() | 删除l最后一个元素 | O(1) |
l.pop(index) | 删除l下标为index的元素 | O(n) |
l.insert(index, x) | 在index位置插入元素x | O(n) |
l.sort() | 原地排序,升序 | O(nlogn) |
l.reverse() | 反转列表 | O(n) |
l.index() | 返回x在列表中的第一个位置 | O(1) |
l.count(x) | 列表中x存在的个数 | O(n) |
l.remove() | 删除列表中元素x,只删除第一个 | O(n) |
del l[2] | 删除下标为2的元素 | O(n) |
x in l | x是否存在于列表 | O(n) |
tuple
不可变。一旦创建不可更改,不能添加、删除元素,不能存储可变类型的数据。
方法 | 解释 |
---|---|
t = (1, 2, 3, 1, 5, 1, 6) | 定义 |
t.count(1) | 元组中数字1的个数 |
t[2] # 3 | 可用下标访问 |
set
可变。集合是无序的、没有重复值。
只能包含不可变的(可哈希化的)数据类型。列表和字典甚至另一个集合都不能作为集合的元素,但是元组可以(因为元组是不可变的)。
方法 | 解释 | 时间复杂度 |
---|---|---|
s1 = {1, 2, 3} s2 = |
定义 | |
s1 - s2 # | s1独有 | |
s1 | s2 # | 并集 | O(n) |
s1 & s2 # | 交集 | O(n) |
s1.add(9) # | 添加元素 | O(1) |
s1.pop() | 随机删除一个 | O(1) |
s1.remove(2) | s1删除元素2 | O(1) |
s1.clear() | 清空 | O(1) |
s1.union(s2) | 并集,相当于 | | O(n) |
s1.intersection(s2) | 交集,相当于 & | O(n) |
s1.issubset(s2) | s1是否为s2子集 | |
x in s1 | x 是否存在于s1 | O(1) , set原理为哈希表 |
由于集合本身是可变的,因此,要想在一个集合中嵌入另一个集合,需要用frozenset创建一个不可变的集合。
a = frozenset([1, 2, 3])
b = set([1, 2, a]) # b为{frozenset({1, 2, 3}), 1, 2}
为什么使用集合?
- 集合内元素是不重复的,因此可以将list或其他类型的数据转换成集合,从而过滤掉其中的重复元素。
dict
key:value,key不可变,value可变。
方法 | 解释 | |
---|---|---|
d.keys() | dict_keys列表 | |
d.values() | dict_values列表 | |
d.items() | [(key, value), (key, value), ..],列表元组 | |
d.get(key) | 无值返回None | O(1) |
d.get(key, default_value) | 无值返回设定的默认值default_value | O(1) |
del d[key] | 删除key-value | O(1) |
d[key] = value | 增加 | O(1) |
x in d | 判断x是否在d.keys()中 | O(1),dict原理为哈希表 |
自Python3.6以后,dict就是有序的了,保持了插入时的顺序,不需要再用collections.OrderedDict保持插入顺序了。若要把字典从小到大排序输出,排序d.keys()即可:
for key in sorted(d.keys()):
print(key, d[kdy])