Python学习之字典及其操作
Python中的六大数据类型(数字、字符串、列表、元组、字典和集合),我们已经讲清楚了前4个,现在我们开始讲解Python中的字典(键值对)数据类型。
在 Python 中,字典(Dictionary)是一种无序、可变的数据类型,用于存储键(key)和值(value)之间的映射关系。并且可以根据键快速检索值。除了基本的添加、删除、获取值之外,还有许多强大的技巧和方法可以让我们更好地利用字典。
一、创建字典
字典的类型为:d = { key1 : value1, key2 : value2, key3 : value3 }
注意:Key必须是唯一的,但Value则不必。
首先,来看一张图,字典的结构就如同下面的这张图,{ }(大花括号)用来声明字典。字典中的每一个元素都是由键值对组成,也就是Key:Value的组合。这里的冒号 : 是用来分割键值对的。同时,Value元素的类型,可以是任何类型的组合。
创建字典,可以由以下几种方法。
#🌾:1. 使用大括号 {} 创建空字典:
my_dict = {} #🌾:2. 使用键值对创建字典:
my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} #🌾:3. 使用 dict() 构造函数:
my_dict = dict(key1='value1', key2='value2', key3='value3') #🌾:4. 使用列表/元组的列表转换为字典:
# 列表中每个元素是一个包含键值对的元组 my_list = [('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')] my_dict = dict(my_list) # 或者使用zip函数 keys = ['key1', 'key2', 'key3'] values = ['value1', 'value2', 'value3'] my_dict = dict(zip(keys, values)) #🌾:5.使用推导式出创建一个列表
# 创建一个简单的字典,键为数字 0 到 4,值为它们的平方 my_dict = {x: x**2 for x in range(5)} print(my_dict) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
二、访问字典中的值
要访问Python字典中的值,你可以使用字典的键(keys)来获取对应的值(values),对比一下,就会发现前面我们学的List(列表)就只能以索引的方式来获取对于的值。这里有几种访问字典中的值常见的方法:
1. 方括号 []
使用方括号 [] 和键名访问值:
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:访问键为 "a" 的值 value_a = my_dict["a"] print(value_a) # 输出: 1 #🌾:访问键为 "b" 的值 value_b = my_dict["b"] print(value_b) # 输出: 2
2. get()
方法
使用 get() 方法,获取键值对。
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:使用 get() 方法获取键为 "c" 的值 value_c = my_dict.get("c") print(value_c) # 输出: 3 #🌾:如果键不存在,get() 方法会返回 None value_d = my_dict.get("d") print(value_d) # 输出: None #🌾:也可以提供一个默认值,如果键不存在则返回该默认值 value_e = my_dict.get("e", 0) # 默认值为 0 print(value_e) # 输出: 0
除了上面的方法,使用 get() 方法可以实现类似于 switch 语句的功能,下面简单演示:
def switch_case(argument): #🌾:定义字典 switcher = { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" } return switcher.get(argument, "Invalid month") # 测试 month_name = switch_case(3) print(month_name) # 输出: March invalid_month = switch_case(13) print(invalid_month) # 输出: Invalid month
3. 遍历键值对
遍历所有的键值对。
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:遍历键值访问 for key, value in my_dict.items(): print(key, value) # 输出 # a 1 # b 2 # c 3
4. 只遍历键
只遍历所有的键。
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:遍历所有的键 for key in my_dict.keys(): print(key) # 输出 # a # b # c
5. 只遍历值
只遍历所有的值。
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:遍历所有的值 for value in my_dict.values(): print(value) # 输出 # 1 # 2 # 3
三、修改字典中的(键值对)
字典是可变的数据类型,所以可以通过添加和更新键值对,来更新字典。下面是几种操作方法:
1. 添加新的键值对
my_dict = {"a": 1, "b": 2} #🌾:添加新的键值对 "c": 3 my_dict["c"] = 3 print(my_dict) # 输出: {'a': 1, 'b': 2, 'c': 3}
2. 更新已有键的值
my_dict = {"a": 1, "b": 2} #🌾:更新键 "b" 的值为 5 my_dict["b"] = 5 print(my_dict) # 输出: {'a': 1, 'b': 5, 'c': 3}
3. update()
方法
使用 update() 方法批量添加或更新键值对:
my_dict = {"a": 1, "b": 2} #🌾:使用 update() 方法批量添加或更新键值对 my_dict.update({"d": 4, "e": 5}) print(my_dict) # 输出: {'a': 1, 'b': 5, 'c': 3, 'd': 4, 'e': 5}
4. setdefault()
方法
使用 setdefault() 方法添加键值对,但仅在键不存在时:
my_dict = {"a": 1, "b": 2} #🌾:使用 setdefault() 方法添加键值对,但仅在键不存在时 my_dict.setdefault("f", 6) print(my_dict) # 输出: {'a': 1, 'b': 2, 'f': 6} #🌾:如果键已存在,则不会进行任何操作 my_dict.setdefault("a", 10) print(my_dict) # 输出:{'a': 1, 'b': 2, 'f': 6}
5. 键不存在时
如果键不存在时执行特定操作:
my_dict = {"a": 1, "b": 2} #🌾:如果键不存在,可以在代码中指定一个操作 if "g" not in my_dict: my_dict["g"] = 7 print(my_dict) # 输出: {'a': 1, 'b': 2, 'g': 7}
四、删除字典中的键值对
既然可以更新键值对,那么删除自然也是可以的,在Python中删除字典(dictionary)中的键值对,你可以使用以下方法:
1. del
关键字
使用 del 关键字删除指定键值对:
my_dict = {"a": 1, "b": 2, "c": 3}
#🌾:删除键为 "a" 的键值对
del my_dict["a"]
print(my_dict) # 输出: {'b': 2, 'c': 3}
2. pop()
方法
使用 pop()
方法删除指定键值对并返回其值:
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:删除键为 "b" 的键值对,并返回被删除的值 deleted_value = my_dict.pop("b") print(deleted_value) # 输出: 2 print(my_dict) # 输出: {'a': 1, 'c': 3}
3. popitem()
方法
使用 popitem() 方法删除并返回最后一个键值对。这是栈的思想。后进先出。
my_dict = {"a": 1, "b": 2, "c": 3} #🌾:删除并返回任意的键值对 removed_item = my_dict.popitem() print(removed_item) # 输出: ('c', 3) print(my_dict) # 输出: {'a': 1, 'b': 2}
4. 清空字典
清空字典中的所有键值对:
my_dict = {"a": 1, "b": 2, "c": 3, "d": 3} #🌾:清空字典 my_dict.clear() print(my_dict) # 输出: {}
5. 删除整个字典
使用 del 关键字删除整个字典:
my_dict = {"a": 1, "b": 2, "c": 3, "d": 3} #🌾:删除整个字典 del my_dict # 此时再访问 my_dict 将会引发 NameError
五、defaultdict
在Python中,collections
模块提供了defaultdict
类,它是字典的一个子类,提供了一个默认值,这样当访问不存在的键时,会自动创建对应默认值的项。这对于处理缺失键的情况非常有用。
#🌾:导入 collections 模块 from collections import defaultdict #🌾:创建一个 defaultdict,指定默认值为 int 类型(默认为 0) my_dict_int = defaultdict(int) #🌾:访问一个不存在的键,会自动创建并初始化为默认值 print(my_dict_int["a"]) # 输出: 0 #🌾:字典中的 "a" 键现在已经被创建 print(my_dict_int) # 输出: defaultdict(<class 'int'>, {'a': 0}) #🌾:创建一个 defaultdict,指定默认值为 str 类型(默认为空字符串) my_dict_str = defaultdict(str) print(my_dict_str["b"]) # 输出: "" #🌾:字典中的 "b" 键现在已经被创建 print(my_dict_str) # 输出: defaultdict(<class 'str'>, {'b': ''})
注意事项:
defaultdict
中的默认值是在调用__getitem__()
方法时创建的,而不是在字典创建时。- 你可以像普通字典一样使用
defaultdict
的所有方法。
这里技巧是:defaultdict
可以让你更加方便地处理缺失键的情况,避免了使用 dict.setdefault()
或者 if
语句来初始化新键的值。
六、Counter
在collections
模块中,除了前面讲到的defaultdict
,另一个 Counter
类也常用于统计可迭代对象中元素的数量:
from collections import Counter #🌾:创建一个 Counter 对象 c = Counter(['a', 'b', 'a', 'c', 'a', 'b']) #🌾:访问元素出现的次数 print(c['a']) # 输出: 3 print(c['b']) # 输出: 2 print(c['c']) # 输出: 1 #🌾:可以直接传入字符串来统计字符出现的次数 word_counts = Counter("hello world") print(word_counts) # 输出: Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1}) #🌾:Counter 也可以像字典一样遍历 for key, value in word_counts.items(): print(f"{key}: {value}") #🌾:获取最常见的元素 print(word_counts.most_common(2)) # 输出: [('l', 3), ('o', 2)]
技巧
提示: Counter
特别适用于统计词频、元素出现次数等需求。