Python 字典Dict概念和操作
# 字典概念:无序的, 可变的键值对集合 # 定义 # 方式1 # {key: value, key: value...} # 例如 # {"name": "xin", "age": 18} d = {"name": "xin", "age": 18} print(d, type(d)) #{'name': 'xin', 'age': 18} <class 'dict'> print(d["name"]) # xin # 方式2 # fromkeys(S, v=None) # 静态方法 # 类和对象都可以调用 # 类调用 # dict.fromkeys("abc", 666) # {'a': 666, 'c': 666, 'b': 666} # 此处的dict, 是指字典类型 # 对象调用 # dic.fromkeys("abc", 666) # {'a': 666, 'c': 666, 'b': 666} # 此处的dic, 是实例化的字典对象 d = dict.fromkeys("abc",888) d1 = dict.fromkeys([1,2,3], 888) print(d) #{'a': 888, 'b': 888, 'c': 888} print(d1) #{1: 888, 2: 888, 3: 888} # 注意 # key不能重复 # 如果重复 # 后值会把前值覆盖 # key必须是任意不可变类型 # 例如 # 可变 # 列表 # 字典 # 可变集合 # ... # 不可变 # 数值 # 布尔 # 字符串 # 元组 # ... # 原因 # Python的字典, 采用哈希(hash)的方式实现 # 简单存储过程 # 初始化一个表格, 用来存放所有的值 # 这个表格称之为"哈希表" # 暂且可理解为我们所学的 "列表" # 在存储一个键值对的时候, 会作如下操作 # 根据给定的key, 通过某些操作, 得到一个在"哈希表"中的索引位置 # 把key通过 "哈希函数" 转换成一个整型数字 # 称为 "哈希值" # 将该数字对数组长度进行取余,取余结果就当作数组的下标 # 如果产生了"哈希冲突" # 比如, 两个不同的key, 计算出来的索引, 是同一个 # 则采用"开发寻址法" # 通过探测函数查找下一个空位 # 根据索引位置, 存储给定的"值" # 简单查找过程 # 再次使用哈希函数将key转换为对应的列表的索引,并定位到列表的位置获取value #怎么知道是可变和不可变的值,可以通过id来观察地址 num = 10 print(id(num)) num = 20 print(id(num)) #和上面的结果地址是不同的,代表赋值后又重新生成一个地址空间,原来地址的值不变,所以就代表不可变类型 #下面是个可变类型 nums = [1, 2, 3] print(id(nums)) nums.append(4) print(id(nums)) #和上面的结果地址相同,代表可变类型 # 存在意义 # 可以通过key, 访问对应的值, 使得这种访问更具意义 # person["name"] # 表述的是获取一个人的姓名 # 查询效率得到很大提升 # 可想象"汉字字典"的使用方式 # 直接根据指定的key找到对应的页码, 从而找到这个汉字 # 不需要一页一页的翻着找 # -----------------------------------------------------常用操作------------------------------# # 增 # dic[key] = value # 当key在原字典中不存在时, 即为新增操作 # 删 # del dic[key] # key, 必须要存在 # dic.pop(key[, default]) # 删除指定的键值对, 并返回对应的值 # 如果key, 不存在, 那么直接返回给定的default值; # 不作删除动作 # 如果没有给定默认值, 则报错 # dic.popitem() # 删除按升序排序后的第一个键值对, 并以元组的形式返回该键值对 # 如果字典为空, 则报错 # # dic.clear() # 删除字典内所有键值对 # 返回None # 注意, 字典对象本身还存在, 只不过内容被清空 # 注意和del的区别 # 改 # 只能改值, 不能改key # 修改单个键值对 # dic[key] = value # 直接设置, 如果key不存在, 则新增, 存在则修改 # 批量修改键值对 # oldDic.update(newDic) # 根据新的字典, 批量更新旧字典中的键值对 # 如果旧字典没有对应的key, 则新增键值对 oldDict = {"name": "xin", "age": 18} newDict = {"age": 28, "address": "china"} oldDict.update(newDict) print(oldDict) #{'name': 'xin', 'age': 28, 'address': 'china'} # 查 # 获取单个值 # 方式1 # dic[key] # 如果key, 不存在, 会报错 # # 方式2 # dic.get(key[, default]) # 如果不存在对应的key, 则取给定的默认值default # 如果没有默认值, 则为None # 但不会报错 # 但是, 原字典不会新增这个键值对 # 方式3 # dic.setdefault(key[, default]) # 获取指定key对应的值 # 如果key不存在, 则设置给定默认值, 并返回该值 # 如果默认值没给定 # 则使用None代替 # 获取所有的值 # dic.values() d = {"name": "xin", "age": 18} print(d.values()) #dict_values(['xin', 18]) # 获取所有的键 # dic.keys() print(d.keys()) #dict_keys(['name', 'age']) # 获取字典的键值对 # dic.items() # 遍历 # for in # for x, y in info.items() # 注意 # Python2.x和Python3.x版本之间关于获取键, 获取值, 获取item, 之间的区别 # Python2.x # 直接是一个列表 # 可通过下标进行获取指定元素 # Python3.x # 中是Dictionary # view # objects # 优势 # 当字典发生改变时, view # objects会跟着发生改变 # 转换成列表使用 # list(result) # 转换成迭代器 # iter(result) # 也可以直接被遍历 # 在Python2.x中提供了如下方法 # viewkeys() # viewvalues() # viewitems() # 作用如同Python3.x中的 # Dictionary # view # objects # 计算 # len(info) # 键值对的个数 # 判定 # x in dic # 判定dic中的key, 是否存在x # x not in dic # 判定dic中的key, 是否不存在x # dic.has_key(key) # 已过期, 建议使用in来代替