字典:
1)字典中的元素是通过键来存储的,而不是通过偏移来存取的。字典是唯一内置的映射类型(键映射到值的对象)
2)是无序集合;
3)字典是作为散列表(支持快速检索的数据结构)(哈希计算)来实现的。Python采用最优化的散列算法来寻找键,因此搜索是很快速的。
key对应的是不可变数据类型,和哈希数据类型,如bool、int、str、元组;
value对应的则是任意数据类型。
常见字典常量和操作:
| 操作 | 功能 |
| D = {} | 空字典 |
| D = {'spam': 2, 'eggs': 3} | 两项目字典 |
| D = {'food': {'ham': 1, 'egg': 2}} | 嵌套 |
| D = dict.fromkeys(['a', 'b']) | 其他构造技术 |
| D = dict(zip(keyslist, valslist)) | |
| D = dict(name = 'Bob', age=42) | |
| D ['eggs'] | 以键进行索引运算 |
| D['food']['ham'] | 以键进行索引运算 |
| ‘eggs’ in D | 成员运算 键存在测试 |
| D.keys() | 方法,获取键 |
| D.values() | 方法获取值 |
| D.items() | 获取键+值 |
| D.copy() | 副本 |
| D.get(key, default) | 默认 |
| D.update(D2) | 合并 |
| D.pop(key) | 删除 |
| len(D) | 长度, 得到字典元素的个数 |
| D[key]=value | 新增、修改键、删除键 |
| del D[key] | 根据键删除条目 |
| list(D.keys()) | 字典视图 |
| D1.keys() & D2.keys() | |
| Dictionary views | |
| D = {x: x*2 for x in range(10)} | 字典解析 |
例1:打印键和值,不使用元组的方式:
需要访问字典里的每个元素,遍历字典。
- people = {'name': 'Alex', 'age': 18, 'height': 175}
-
- for k, v in people.items():
- print(k, v)
说明:items方法,返回的是一个类似列表一样的元素。其中每个元素就是键值对组成的元素。
有点类似:
[('name',‘Alex’), ('age', 18), ('height', 175)]

例2:字典的增删改查的方法:
增:
D[key]=value 添加、修改键的值;
D.setdefault('weight, 100) 有键值就不做任何改变;
删:
D.pop('age') 删除age键,有返回值;pop方法会返回参数key对应的Value值。
D.pop('age1', 'No keys') 设置错误提示信息
D.popitem() 随机删除
D.clear() 清空字典,另外还有一个重新赋值的方法,members变量指向的就是一个新的空字典对象。原来的字典对象呢?因为没有被引用,就会被Python解释器在合适的时候从内存中删除。垃圾回收。
del D['name'] 删除元素,尽量使用pop,如果没有键,则会报错。
改:
D.update 合并(没有就加进来,有就覆盖)
查:
D.keys()
D.values()
D.items()
D.get(keys, default): 第二个参数是错误信息提示;
例3:将列表元素进行分类:
- L = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
-
- D = {}
- L_greater_66 = []
- L_less_66 = []
-
- for i in L:
- if i == 66:
- continue
- elif i > 66:
- L_greater_66.append(i)
- else:
- L_less_66.append(i)
-
- D['k1'] = L_greater_66
- D['k2'] = L_less_66
-
- print(D)
2022年12月7日:
增加一道字典的题目,会用到lambda函数。
- portfolio = [
- {'name': 'IBM', 'shares': 100, 'price': 91.1},
- {'name': 'AAPL', 'shares': 50, 'price': 543.22},
- {'name': 'FB', 'shares': 200, 'price': 21.09},
- {'name': 'HPQ', 'shares': 35, 'price': 31.75},
- {'name': 'YHOO', 'shares': 45, 'price': 16.35},
- {'name': 'ACME', 'shares': 75, 'price': 115.65}
- ]
-
- # 计算购买每支股票的总价
- ret = map(lambda dic: {dic['name']: round(dic['shares'] * dic['price'], 2)}, portfolio)
- print(list(ret))
-
- # 用filter过滤出,单价大于100的股票有哪些
- ret = filter(lambda dic: True if dic['price'] > 100 else False, portfolio)
- print(list(ret))
-
- ret = filter(lambda dic: dic['price'] > 100, portfolio)
- print(list(ret))