概念
无序的,可变的键值对集合
键也可以是整型数
定义
只能通过key获取对应的值
#方式一
person = {
"name" : "lyw",
"age" : 18
}
print(person) #{'name': 'lyw', 'age': 18}
print(person["name"]) #lyw
静态方法:类和对象都可以调用,他不需要实例化 直接调用就可以
#d = dict.fromkeys(seq, value)
#seq必须是有序的集合 字典无顺序!
#把seq元素分解,每一个当作一个key value是初始化的值,默认为None
d = dict.fromkeys("abc")
print(d) #{'a': None, 'b': None, 'c': None}
1. key不能重复,重复的话,后值会把前值给覆盖掉
2. key必须是任意不可变类型
可变 :list、字典、可变集合
不可变 :数值、布尔、字符串、元组
d = {1 : 1, 1 : 2}
print(d) #{1: 2}
python的字典,采用hash的方式实现
1. 存储过程: 初始化一块表格(哈希表,用于存放所有的值
根据给定的key,通过某些操作,得到一个”哈希表“里面的指定索引位置
根据索引位置,存储给定的值
2.取值过程: 根据key,运算索引,查找对应数值
索引转换过程:
1 将key转换为整形数字 ”哈希值“
2 对数组的长度进行取余,取余结果作为数组的下标
3 如果产生”哈希冲突“,采用”开放寻址法“,通过探测函数寻找下一个空位。
存在意义
1 通过key访问对应的值,使得访问更有意义
2 查询效率有很大的提升
常用操作
增加
#dic[key : value]
#当key在原字典不存在时候,即为新增操作
d = {"name" : "hello", "age" : 18}
print(d, id(d)) #{'name': 'hello', 'age': 18} 2209878362368
d["height"] = 180
print(d, id(d)) #{'name': 'hello', 'age': 18, 'height': 180} 2209878362368
删除
#方法1 del dic[key]
#不能删除不存在的key,否则会报错key error
d = {"name" : "hello", "age" : 18}
print(d) #{'name': 'hello', 'age': 18}
del d["name"]
print(d) #{'age': 18}
#方法2 dic.pop(key [,default])
#弹出给定的键值对,返回其对应的值
#若key不存在,返回给定的default值 不做删除动作
#若key不存在,无default值 则报错
d = {"name" : "hello", "age" : 18}
print(d, d.pop("name")) #{'age': 18} hello
print(d.pop("height", 180)) #180
#print(d.pop("height")) #KeyError: 'height'
#方法3 dic.popitem()
#删除按照升序排序后的第一个键值对,以元组的形式返回该键值对
#如果字典为空 报错
d = {"name" : "hello", "age" : 18}
print(d.popitem()) #('age', 18)
print(d) #{'name': 'hello'}
d = {}
#print(d.popitem()) #'popitem(): dictionary is empty'
#方法4 dic.clear()
#删除字典里面所有的键值对
#返回None
#字典本身还存在 只不过值为空 del是可以删除整个字典
d = {"name" : "hello", "age" : 18}
print(d.clear()) #None
print(d) #{}
d = {"name" : "hello", "age" : 18}
del d
print(d) #NameError: name 'd' is not defined
修改
只能改值,不能改key
#dic[key] = value
d = {"name" : "xxx", "age" : 18}
print(d) #{'name': 'xxx', 'age': 18}
d["name"] = "1"
print(d) #{'name': '1', 'age': 18}
#olddic.update(newdic)
#批量修改键值对 有则改之 无则加入
d = {"name" : "xxx", "age" : 18}
d.update({"name" : "123", "height" : 180})
print(d) #{'name': '123', 'age': 18, 'height': 180}
查询操作
获取单个值
#1 dic[key]
d = {"name" : "xxx", "age" : 18}
print(d["name"]) #xxx 必须用key 不能是索引!
#2 dic.get(key [,default])
#如果不存在key 则取对应的默认值default
#如果没有默认值 则返回None
#不存在key时候,不会新增键值对
d = {"name" : "xxx", "age" : 18}
print(d.get("name")) #xxx
print(d.get("height", 666)) #666
print(d.get("height")) #None
#3 dic.setdefault(key[, default])
#获取指定key对应的值
#如果key不存在,设定给定的默认值,返回默认值
#如果默认值没给定 则None 会加入新的位未知的键值对
d = {"name" : "xxx", "age" : 18}
print(d.setdefault("name")) #xxx
print(d.setdefault("height")) # None
print(d) #{'name': 'xxx', 'age': 18, 'height': None}
获取多个key/值
视图对象
不支持索引
#获取所有值
#dic.values()
d = {"name" : "xxx", "age" : 18}
print(d.values()) #dict_values(['xxx', 18]) <class 'dict_values'>
#获取所有的键
print(d.keys()) #dict_keys(['name', 'age'])
#获取键值对
print(d.items()) #dict_items([('name', 'xxx'), ('age', 18)])
print(list(d.items())) #[('name', 'xxx'), ('age', 18)]
print(tuple(d.items())) #(('name', 'xxx'), ('age', 18))
遍历
#先获取所有的key 然后根据取到的key,获取对应的值
d = {"name" : "xxx", "age" : 18}
keys = d.keys()
for key in keys:
print(d[key]) #xxx 18
#直接遍历所有的键值对
items = d.items()
for key,value in items:
print(key, value) #name xxx age 18
计算键值对的个数
d = {"name" : "xxx", "age" : 18}
print(len(d)) #2
判断key是否在字典中
#key in dic
d = {"name" : "xxx", "age" : 18}
print("name" in d) #True
#key not in dic
print("height" in d) #False