一、字典1.1 字典的概念字典是一种键值对结构。键值对是计算机中一个广泛使用的概念指的是把“键key”和“值value”进行一对一映射然后就可以根据“键”来快速找到“值”。在Python中可以同时包含很多个键值对同时要求这些键不能重复。1.2 字典的创建可以直接用大括号表示一个字典也可以用关键字dict。a {} print(type(a)) b dict() print(type(b))一个字典中的key类型不一定都一样。一个字典中的value的类型也不必都一样字典对于value是什么类型没有约束但是对key是什么类型有一定约束。可以把一个字典分多行来写a { id: 1, name:harry, age: 22, gender: male, } print(a)最后一个键值对后面的逗号可有可无但是前面的键值对一定要用逗号隔开。1.3 查找key可以用in来判断某个key是否在字典中存在。用not in则判断的结果与使用 in 相反。注意:in查找的是key与value无关。a { id: 1, name:harry, age: 22, gender: male, } print(id in a) print(score in a) print(name not in a)用[ ]可以根据key找到value。如果查找的key不存在会报错。a { id: 1, name:harry, age: 22, gender: male, } print(a[name]) print(a[age]) print(a[score])对于字典来说使用in或者[ ]来获取value都是非常高效的操作这是因为字典背后使用了一种特殊的数据结构哈希表。而对于列表来说使用in是比较低效的而使用[ ]是比较高效的。1.4 新增/修改元素使用 [ ]可以根据key来新增/修改value。如果这个key原来在字典中不存在那么这个操作就是在字典中新增一个key如果原来存在就相当于根据key修改value。a { id: 1, name:harry, age: 22, gender: male, } a[score] 90 print(a) a[score] 100 print(a)使用pop方法可以根据key来删除键值对。a { id: 1, name:harry, age: 22, gender: male, score:90 } print(a) a.pop(id) print(a)字典的各种操作都是针对key来进行的。增、删、查、改都要基于key来进行。1.5 遍历字典元素字典的结构设计出来其实不是为了遍历的。刚才说过字典的底层是哈希表。哈希表的结构设计非常巧妙能够以常数级的时间复杂度完成增删查改操作无论字典中有多少元素增删查改都是固定时间不会因为元素多了操作就变慢。不过Python还是提供了遍历字典元素的操作。我们可以直接使用for循环遍历一个字典。a { id: 1, name:harry, age: 22, gender: male, score:90 } for key in a: print(key, a[key])在C或者Java中哈希表里键值对的存储顺序是无序的。但是在Python中有所不同Python中做了特殊处理能够保证遍历出来的顺序和插入顺序一致。可见Python中的字典不是一个单纯的哈希表。1.6 取出所有key和value使用keys方法可以获取字典中的所有key使用values可以获取字典中的所有value使用items可以获取字典中的所有键值对。a { id: 1, name:harry, age: 22, gender: male, score:90 } print(a.keys()) print(a.values()) print(a.items())keys和values返回的结果像列表但其实是一个自定义类型。不过可以把它当作列表来使用。items返回的结果是一个列表一样的结构里面的每一个元素是一个元组元组里包含了键和值。可以用for循环实现遍历。a { id: 1, name:harry, age: 22, gender: male, score:90 } for k, v in a.items(): print(k, v)1.7 合法的key类型字典本质是哈希表哈希表的key要求是“可哈希”的也就是可以计算出一个哈希值。Python中提供了一个hash函数可以计算出变量的哈希值。print(hash(0)) print(hash(3.14)) print(hash(True)) print(hash(hello)) print(hash((1, 2, 3)))上述这些类型的变量都是可以计算哈希值的。而有的类型比如列表和字典就不能计算哈希值。不可变的对象一般就是课哈希的。可变的对象一般就是不可哈希的。可哈希的变量就可以作为字典的‘key’。像字典、列表、元组这些内部可以再包含其他元素的类型称为“容器”或者“集合类”。