字典的定义
dictionary(字典)是除列表以外 Python之中最灵活的数据类型。
字典同样可以用来存储多个数据,通常用于存储描述一个物体的相关信息。
和列表的区别:列表是有序的对象集合,字典是无序的对象集合。
字典用大括号{}定义,以键值对的方式存储数据,键值对之间使用逗号,分隔,键和值之间使用冒号:分隔。
注意点:键key是索引,值value是数据,键必须是唯一的,值可以取任何数据类型,但键只能使用字符串、数字或元组。
以下是字典的示意图
实例
xiaoming = {"name": "小明",
"age": 18,
"gender": True,
"height": 1.75}
字典常用操作
1、创建字典
最常用的就是直接用 {} 创建一个字典。
还可以用 fromkeys 方法创建字典。
格式
dictname = dict.fromkeys(list,value=None)
其中,list 参数表示字典中所有键的列表,value 参数表示默认值,如果不写,则为空值 None。
knowledge = [\'语文\', \'数学\', \'英语\']
scores = dict.fromkeys(knowledge, 60)
print(scores)
### {\'数学\': 60, \'语文\': 60, \'英语\': 60}
这种创建方式通常用于初始化字典,设置 value 的默认值。
2、字典取值
xiaoming_dict = {"name": "小明"}
print(xiaoming_dict["name"])
#小明
# 在取值的时候,如果指定的key不存在,程序会报错!
print(xiaoming_dict["name123"])
# KeyError: \'name123\'
get 方法返回指定键的值,如果值不在字典中返回默认值。
xiaoming_dict = {"name": "小明"}
print(xiaoming_dict.get("name", \'不存在\'))
# 小明
print(xiaoming_dict.get("age", \'不存在\'))
# 不存在
3、字典的增加/修改
xiaoming_dict = {"name": "小明"}
# 如果key不存在,会新增键值对
xiaoming_dict["age"] = 18
print(xiaoming_dict["age"])
# 18
# 如果key存在,会修改已经存在的键值对
xiaoming_dict["name"] = "小小明"
print(xiaoming_dict["name"])
# 小小明
4、字典的删除
pop删除字典中指定的键值对。
xiaoming_dict = {"name": "小明"}
xiaoming_dict.pop("name")
print(xiaoming_dict)
# {}
# 在删除指定键值对的时候,如果指定的key不存在,程序会报错!
xiaoming_dict.pop("name123")
# KeyError: \'name123\'
popitem() 用来随机删除一个键值对。
a = {\'语文\': 89, \'英语\': 90, \'生物\': 98, \'物理\': 89, \'化学\': 83, \'数学\': 95, }
a.popitem()
print(a)
# {\'语文\': 89, \'英语\': 90, \'生物\': 98, \'物理\': 89, \'化学\': 83}
其实,说 popitem() 随机删除字典中的一个键值对是不准确的,虽然字典是一种无序的列表,但键值对在底层也是有存储顺序的。
popitem() 总是弹出底层中的最后一个键值对,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作。
5、统计键值对数量
xiaoming_dict = {"name": "小明",
"age": 18}
print(len(xiaoming_dict))
# 2
6、合并字典
xiaoming_dict = {"name": "小明",
"age": 18}
temp_dict = {"height": 1.75,
"age": 20}
# 注意:如果被合并的字典中包含已经存在的键值对,会覆盖原有的键值对
xiaoming_dict.update(temp_dict)
print(xiaoming_dict)
# {\'name\': \'小明\', \'age\': 20, \'height\': 1.75}
7、清空字典
xiaoming_dict = {"name": "小明",
"age": 18}
xiaoming_dict.clear()
print(xiaoming_dict)
# {}
8、直接赋值和浅复制的区别
dict1 = {\'user\': \'runoob\', \'num\': [1, 2, 3]}
# 浅拷贝: 引用对象
dict2 = dict1
# 浅拷贝:深拷贝父对象(一级目录),
# 子对象(二级目录)不拷贝,还是引用
dict3 = dict1.copy()
# 修改 data 数据
dict1[\'user\'] = \'root\'
dict1[\'num\'].remove(1)
# 输出结果
print(dict1)
print(dict2)
print(dict3)
#{\'user\': \'root\', \'num\': [2, 3]}
#{\'user\': \'root\', \'num\': [2, 3]}
#{\'user\': \'runoob\', \'num\': [2, 3]}
9、获取字典中特定数据
keys() 方法用于返回字典中的所有键(key)
values() 方法用于返回字典中所有键对应的值(value)
items() 用于返回字典中所有的键值对(key-value)
scores = {\'数学\': 95, \'语文\': 89, \'英语\': 90}
print(scores.keys())
print(scores.values())
print(scores.items())
# dict_keys([\'数学\', \'语文\', \'英语\'])
# dict_values([95, 89, 90])
# dict_items([(\'数学\', 95), (\'语文\', 89), (\'英语\', 90)])
在 Python 3.x 中,它们的返回值并不是我们常见的列表或者元组类型,因为 Python 3.x 不希望用户直接操作这几个方法的返回值。
可以使用 list() 函数,将它们返回的数据转换成列表。
a = {\'数学\': 95, \'语文\': 89, \'英语\': 90}
b = list(a.keys())
print(b)
# [\'数学\', \'语文\', \'英语\']
10、字典的循环遍历
依次从字典中获取所有键值对。
xiaoming_dict = {"name": "小明",
"qq": "123456",
"phone": "10086"}
# 变量k是每一次循环中,获取到的键值对的key
for k in xiaoming_dict:
print("%s - %s" % (k, xiaoming_dict[k]))
# name - 小明
# qq - 123456
# phone - 10086
提示:在实际开发中,由于字典中每一个键值对保存数据的类型是不同的,所以针对字典的循环遍历需求并不是很多。
在我们的实际开发中,字典和列表非常常见的一个应用场景。
我们用一个字典的多个键值对来描述一个物体的所有相关信息,然后把多个字典放在同一个列表中,通过一个循环遍历,在循环体内部针对每个字典执行相同的操作。
card_list = [
{"name": "张三",
"qq": "12345",
"phone": "110"},
{"name": "李四",
"qq": "54321",
"phone": "10086"}
]
for card_info in card_list:
print(card_info)
# {\'name\': \'张三\', \'qq\': \'12345\', \'phone\': \'110\'}
# {\'name\': \'李四\', \'qq\': \'54321\', \'phone\': \'10086\'}