dict
原理:
在Python3中,dict是一种非常重要的数据结构,它用于存储键值对,提供了一种高效的查询方法。dict的底层实现采用了哈希表(hash table)的方式。
具体来说,Python3中的dict内部实现了一个哈希表,每个键值对被存储在一个叫做“bucket”的数据结构中。哈希表本质上是一个数组,每个数组元素是一个指向bucket的指针。当我们向dict中添加一个新的键值对时,Python会根据键的哈希值计算出该键值对应的bucket的位置,然后将该键值对添加到对应的bucket中。
为了解决哈希冲突的问题,Python3采用了开放寻址法(open addressing)来解决。具体来说,当两个键的哈希值相同时,Python会在哈希表中寻找下一个空闲的位置,并将键值对添加到该位置中。如果该位置已经被占用,则继续寻找下一个空闲的位置,直到找到一个空闲的位置为止。
为了提高查询效率,Python3的dict还维护了一个叫做“lookup”的缓存,用于缓存最近访问的键值对。当我们访问一个键值对时,如果该键值对已经在lookup缓存中,则可以直接返回结果,否则就需要遍历哈希表,查找对应的bucket。
需要注意的是,由于哈希表的大小是固定的,当哈希表中的元素数量达到一定阈值时,Python3会自动进行哈希表的扩容操作。这个操作会重新申请一块更大的内存空间,并将原有的键值对重新计算哈希值并存储到新的哈希表中。这样就能够保证dict的性能和稳定性,从而避免因为哈希表的限制而导致程序崩溃。
注意事项:
键值映射的数据类型 key-value
无序 -->没有下标,不能进行切片
可变数据类型
元素之间有关系适合用字典存储数据
字典的key --》天生去重1 这是因为对应的密文相同,
key 必须是可hash(哈希)对象 --》不可变数据类型
value 可以是任何值
字典的定义
在 Python 3 中,可以使用花括号 {}
或 dict()
函数来定义字典。字典由键和对应的值组成,每个键值对之间用逗号分隔,键和值之间用冒号分隔。以下是两种常见的字典定义方式:
- 使用花括号
{}
定义字典
arduinoCopy code
my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
2.使用 dict()
函数定义字典
pythonCopy code
my_dict = dict(key1='value1', key2='value2', key3='value3')
在以上两个示例中,my_dict
是一个包含三个键值对的字典,其中键为 key1
、key2
和 key3
,对应的值分别为 value1
、value2
和 value3
。
d1 = {"name":"sctl","age":18}
print(d1["name"])
print(d1["age"])
print(d1["sdasd"]) #keyError,在这里程序会退出,这里也是取值
print("end.......")
key可以是元组
d3 = {(1,2):"abc"}
print(d3)
print(1 in d3.keys())
字典的方法
字典(dictionary)是一种无序的数据结构,用于存储键值对。以下是 Python3 字典常用的方法:
- clear():清空字典中的所有元素。
- copy():返回一个字典的浅拷贝。
- get(key[, default]):返回字典中键 key 对应的值,如果键不存在,则返回默认值 default。
- items():返回一个包含所有 (键, 值) 元组的列表。
- keys():返回一个包含字典中所有键的列表。
- pop(key[, default]):删除并返回字典中键 key 对应的值,如果键不存在,则返回默认值 default。
- popitem():随机删除并返回字典中的一对键值对。
- setdefault(key[, default]):返回字典中键 key 对应的值,如果键不存在,则设置默认值 default,并返回该默认值。
- update([other]):用另一个字典或键值对序列更新当前字典。
- values():返回一个包含字典中所有值的列表。
以下是一个使用字典的示例:
# 创建一个字典
my_dict = {'apple': 2, 'banana': 3, 'orange': 5}
# 获取键 'apple' 的值
print(my_dict.get('apple'))
# 返回所有的键
print(my_dict.keys())
# 删除键 'banana'
my_dict.pop('banana')
# 更新字典
my_dict.update({'pear': 4, 'grape': 6})
# 返回所有的值
print(my_dict.values())
输出:
2
dict_keys(['apple', 'banana', 'orange'])
dict_values([2, 5])
字典的取值:
d4 = {"a":1,"b":2}
print(d4.get("x")) ##使用get的取值,不会报错,返回none
print(d4.get("a"))
print(d4.get("sss",10)) ####使用get取值的时候,key不存在,就返回默认值,如果没有默认值就返回none
print(d4.get("b",20))
字典的新增和修改
##key存在就是修改,不存在就是新增
d4["c"] = 3
print(d4.get("c"))
d4["a"]=30
print(d4.get("a"))
字典的遍历
d1 ={"a":1,"b":2,"c":3}
for i in d1:
print(i)
#Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。
for i in d1.items():
print(i)
for k,v in d1.items(): ##k取key,v取对于的值
print(f"{k} -->{v}")
字典成员关系判断
d1 ={"a":1,"b":2,"c":3} #True
print("a" in d1) #False
print(1 in d1) ##默认情况下,判断key
print(d1.values() ) ##查看所有值 -》 dict_values([1, 2, 3])
print(d1.keys()) ##查看所有key -》 dict_keys(['a', 'b', 'c'])
print(1 in d1.values())
字典的删除
#######删除
d1={'b':2,'a':1,'c':3}
##删除指定key的内容
d1.pop("a")
print(d1)
# 默认删除字典最后一个,会返回删除的值
print("返回值:",d1.popitem())
print(d1)
字典的合并
合并:
1.
d2={'d':4}
# 会改变d1的内容,将d2合并进去
d1.update(d2)
print("d1:",d1)
2.
####生成新字典合并
d3=dict(d1,**d2)
print("d3:",d3)