详解Python中的Dict
Python中的Dict,即字典,是一种非常常用的数据类型。字典是一种无序的、可变的key-value对集合,其中key不可重复且必须是可哈希的数据类型,value可以为任意数据类型。本文将详细介绍字典的定义、遍历、添加删除、修改操作、排序和常用方法。
定义字典
字典可以使用{}
或dict()
来定义,其中key和value之间使用冒号分隔,每一组键值对使用逗号分隔。
my_dict = {'name': '张三', 'age': 20, 'gender': '男'}
# 或者
my_dict = dict(name='张三', age=20, gender='男')
遍历字典
遍历字典也可以使用多种方式。可以使用for
循环遍历所有的键值对,也可以使用keys()
、values()
、items()
方法来分别遍历键、值、键值对。
# 遍历所有键值对
for key, value in my_dict.items():
print(key, value)
# 遍历所有键
for key in my_dict.keys():
print(key)
# 遍历所有值
for value in my_dict.values():
print(value)
添加和删除键值对
添加键值对可以使用[key]
方式或update()
方法,删除键值对可以使用del
语句或pop()
方法。如果删除的键不存在,使用del
语句会报错,使用pop()
方法则会返回一个默认值,不会报错。
# 添加键值对
my_dict['score'] = 90
my_dict.update(course='math') # 添加一组键值对
# 删除键值对
del my_dict['score']
my_dict.pop('course', 'not exist') # 删除一个不存在的键,返回默认值
修改键值对
修改键值对可以直接使用[key]
方式,如果key不存在,会直接添加该键值对。
my_dict['name'] = '李四' # 修改name的值
my_dict['height'] = 1.75 # 添加height键值对
排序
字典是无序的,但是我们可以使用sorted()
函数和items()
方法来对字典中的键值对进行排序。排序时默认按照键的升序排列,也可以使用reverse=True
参数来逆序排序。
# 按键升序排列
for key, value in sorted(my_dict.items()):
print(key, value)
# 按值降序排列
for key, value in sorted(my_dict.items(), key=lambda x: x[1], reverse=True):
print(key, value)
常用方法
除了上述介绍的方法外,字典还有一些常用的方法,下面介绍其中几个。
-
get(key, default=None)
方法可以根据key获取对应的value,如果key不存在,会返回一个默认值,默认为None。 -
keys()
方法返回所有键的列表。 -
values()
方法返回所有值的列表。 -
update(other_dict)
方法可以将另一个字典的键值对添加到当前字典中。
示例说明
下面通过两个示例说明字典的使用。
示例1:统计字符出现次数
s = 'hello world'
count_dict = {}
for char in s:
if char in count_dict:
count_dict[char] += 1
else:
count_dict[char] = 1
print(count_dict)
输出结果:{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
示例2:根据分数段统计人数
stu_dict = {'小明': 78, '小红': 92, '小刚': 85, '小李': 66, '小张': 74, '小王': 81}
score_dict = {'60~69': 0, '70~79': 0, '80~89': 0, '90~100': 0}
for name, score in stu_dict.items():
if score >= 90:
score_dict['90~100'] += 1
elif score >= 80:
score_dict['80~89'] += 1
elif score >= 70:
score_dict['70~79'] += 1
else:
score_dict['60~69'] += 1
print(score_dict)
输出结果:{'60~69': 1, '70~79': 2, '80~89': 2, '90~100': 1}