有以下三种方法创建字典
# 字面量语法 student1 = { 'id': 1001, 'name': '小青', 'sex': '女', 'birthday': '1999-07' } print(student1) # 构造器函数 student2 = dict(id=1002, name='小白', sex='女', birthday='2000-01') print(student2) # 生成式语法(推导式语法) dict1 = {i: i ** 2 for i in range(1, 9)} print(dict1)
运行结果:
{'id': 1001, 'name': '小青', 'sex': '女', 'birthday': '1999-07'} {'id': 1002, 'name': '小白', 'sex': '女', 'birthday': '2000-01'} {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
还有一种常用的创建字典的方法,将列表和字符串、列表和列表、字符串与字符串压缩并创建字典。
# 可以通过Python内置函数zip压缩两个序列并创建字典 items1 = dict(zip('ABCDE', '12345')) print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'} items2 = dict(zip('ABCDE', range(1, 10))) print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5} list1 = [1, 2, 3] str1 = 'hello' list2 = ['xx', 'yy', 'zz'] print(dict(zip(str1, list1))) # {'h': 1, 'e': 2, 'l': 3} print(dict(zip(list2, list1))) # {'xx': 1, 'yy': 2, 'zz': 3}
遍历列表
student1 = { 'id': 1001, 'name': '小青', 'sex': '女', 'birthday': '1999-07' } # 循环遍历 # 遍历字典中的键 for key in student1: print(key, student1[key]) print('-' * 20) # 遍历字典中的键 for key in student1.keys(): print(key, student1[key]) print('-' * 20) # 遍历字典中的值 for value in student1.values(): print(value) print('-' * 20) # 遍历字典中的键值对 for key, value in student1.items(): print(key, value)
运行结果:
id 1001 name 小青 sex 女 birthday 1999-07 -------------------- id 1001 name 小青 sex 女 birthday 1999-07 -------------------- 1001 小青 女 1999-07 -------------------- id 1001 name 小青 sex 女 birthday 1999-07
成员运算可以判定指定的键在不在字典中,索引运算可以通过键获取对应的值或者向字典中加入新的键值对。值得注意的是,字典的索引不同于列表的索引,列表中的元素因为有属于自己有序号,所以列表的索引是一个整数;字典中因为保存的是键值对,所以字典的索引是键值对中的键,通过索引操作可以修改原来的值或者向字典中存入新的键值对。
字典中的键必须是不可变类型,例如整数(int
)、浮点数(float
)、字符串(str
)、元组(tuple
)等类型的值;显然,列表(list
)和集合(set
)是不能作为字典中的键的,当然字典类型本身也不能再作为字典中的键,因为字典也是可变类型,但是字典可以作为字典中的值。
student = dict(id=1002, name='小白', sex='女', birthday='2000-01') # 成员运算 print('name' in student) # True print('age' in student) # False print('address' not in student) # True # 索引运算 # 字典的索引运算放在赋值运算符的左边 # 如果索引对应的键在字典中存在,就更新它的值 student['name'] = '小柔' # 如果索引对应的键在字典中不存在,就增加键值对 student['address'] = '四川成都' print(student) # {'id': 1002, 'name': '小柔', 'sex': '女', 'birthday': '2000-01', 'address': '四川成都'} print(student['birthday']) # 2000-01 # 使用get函数通过key获取value时,如果key不存在,返回None print(student.get('age')) # None # 如果key不存在,返回指定的值 print(student.get('age', 20)) # 20 # 删除键值对 print(student.pop('id')) # 1002 del student['name'] print(student) # {'sex': '女', 'birthday': '2000-01', 'address': '四川成都'} print(student.get('name', '无名氏')) # 无名氏 # 如果使用索引运算,必须保证键一定存在,否则会报错 if 'birthday' in student: print(student['birthday']) # 2000-01
dict1 = {'A': 100, 'B': 200, 'C': 300} dict2 = {'D': 400, 'E': 500, 'A': 600} # 更新字典 dict1.update(dict2) print(dict1) # {'A': 600, 'B': 200, 'C': 300, 'D': 400, 'E': 500} # 删除 ---> 键必须存在,否则会产生KeyError del dict1['B'] dict1.pop('C') print(dict1) # {'A': 600, 'D': 400, 'E': 500} # 删除最后一个键值对 dict1.popitem() print(dict1) # {'A': 600, 'D': 400} # 清空字典 dict1.clear() print(dict1) # {} # 如果键存在,返回对应的值,如果不存在,添加一个新的键值对,并返回对应的值 print(dict2.setdefault('A')) # 600 print(dict2.setdefault('K', 1000)) # 1000 print(dict2) # {'D': 400, 'E': 500, 'A': 600, 'K': 1000}
例1:输入一段话,统计每个英文字母出现的次数。
import string str1 = input() # 英文字母转小写 str1 = str1.lower() # 产生由26个键为小写英文字母,值为0构成的字典 dict_str = {letter: 0 for letter in string.ascii_lowercase} # 统计每个英文字母出现的次数 for s in str1: if s in dict_str: dict_str[s] += 1 for letter, count in dict_str.items(): print(f'{letter}: {count}')
调用string库中的
ascii_lowercase
变量可以得到26个小写英文字母。
例2:在一个字典中保存了股票的代码和价格,找出股价大于100元的股票并创建一个新的字典,找出价格最高和最低的股票对应的股票代码按照股票价格从高到低给股票代码排序
stocks = { 'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ORCL': 48.44, 'ACN': 166.89, 'FB': 208.09, 'SYMC': 21.29 } stocks1 = {k: v for k, v in stocks.items() if v > 100} print(stocks1) # {'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ACN': 166.89, 'FB': 208.09} # zip可以把两个列表压缩成若干个二元组 print(max(zip(stocks.values(), stocks.keys()))[1]) # GOOG print(min(zip(stocks.values(), stocks.keys()))[1]) # SYMC # 按值求最大的,返回最大值对应的键 print(max(stocks, key=stocks.get)) # GOOG # 按值求最小的,返回最小值对应的键 print(min(stocks, key=stocks.get)) # SYMC # 按值排序,返回一个排好序的列表,reverse = True表示降序 print(sorted(stocks, key=stocks.get, reverse=True)) # ['GOOG', 'FB', 'AAPL', 'ACN', 'IBM', 'ORCL', 'SYMC']