Python 中的字典、映射和散列表是非常重要的数据结构,可以用来存储和操作键值对。在下面的攻略中,我们将介绍Python中字典、映射和散列表的使用方法和相关注意事项。
Python 字典(Dictionary)
Python 字典是一种可变的映射类型,它是无序的键值对集合。字典中的元素通过键来访问,而不是通过索引。字典的键是唯一的,对应的值可以重复。
创建字典
使用{键:值}
的方式来创建字典,其中键和值用冒号隔开,多个键值对使用逗号分隔。
# 创建空字典
d = {}
# 创建包含键值对的字典
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
# 或者通过 dict 函数创建字典
d = dict(name='Bob', age=22, gender='male')
访问字典中的值
可以通过字典的键来访问对应的值。
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
print(d['name']) # 输出 Alice
如果访问一个不存在的键,会抛出 KeyError
异常。为了避免这种情况,可以使用 get()
方法。如果键不存在,get()
方法将返回 None
(或者指定的默认值)。
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
print(d.get('grade', 'unknown')) # 输出 unknown
修改字典中的值
可以通过指定键来修改字典中的值。
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
d['name'] = 'Bob'
print(d) # 输出 {'name': 'Bob', 'age': 18, 'gender': 'female'}
删除字典中的键值对
可以使用 del
关键字来删除字典中的键值对。
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
del d['name']
print(d) # 输出 {'age': 18, 'gender': 'female'}
遍历字典
可以使用 for
循环遍历字典的键值对。
d = {'name': 'Alice', 'age': 18, 'gender': 'female'}
for key, value in d.items():
print(f'{key}: {value}')
Python 映射(Mapping)
Python 映射是一种通用的键值对容器,除了字典外还包括了其他实现。它们的共同点是都可以通过键来访问对应的值,可以说是字典的抽象。
defaultdict
defaultdict
是 dict
的一个子类,它重写了一个方法 __missing__
,当访问一个不存在的键时,它不会报错,而是根据指定的类型,返回一个新的默认值。
from collections import defaultdict
d = defaultdict(list)
d[1].append('A')
d[2].append('B')
d[1].append('C')
print(d) # 输出 defaultdict(<class 'list'>, {1: ['A', 'C'], 2: ['B']})
Counter
Counter
是一个用来计数的工具,它可以统计字符出现的次数。
from collections import Counter
text = 'ababcbabc'
c = Counter(text)
print(c) # 输出 Counter({'b': 4, 'a': 3, 'c': 2})
可以使用 most_common()
方法获取出现次数最多的几个字符。
from collections import Counter
text = 'ababcbabc'
c = Counter(text)
print(c.most_common(2)) # 输出 [('b', 4), ('a', 3)]
Python 散列表(Hash Table)
Python 散列表是一种根据键(Key)直接访问值(Value)的数据结构。它通过散列函数将键映射到存储桶(Bucket)中,然后通过存储桶的索引来访问值。散列表在实现字典和集合等数据结构时得到了广泛的应用。
创建散列表
可以使用 {key: value}
的方式来创建散列表。
d = {'name': 'Alice', 'age': 18, 1: 'one'}
print(d) # 输出 {'name': 'Alice', 'age': 18, 1: 'one'}
访问散列表
通过散列函数计算出键对应的存储桶的索引,将值存储在对应的存储桶中。当需要访问时,再通过散列函数计算出键的索引,直接访问对应的存储桶即可。
d = {'name': 'Alice', 'age': 18, 1: 'one'}
print(d['age']) # 输出 18
修改散列表
和字典一样,可以通过指定键来修改散列表中的值。
d = {'name': 'Alice', 'age': 18, 1: 'one'}
d['age'] = 20
print(d) # 输出 {'name': 'Alice', 'age': 20, 1: 'one'}
删除散列表中的键值对
同样可以使用 del
关键字来删除散列表中的键值对。
d = {'name': 'Alice', 'age': 18, 1: 'one'}
del d['age']
print(d) # 输出 {'name': 'Alice', 1: 'one'}
示例
示例1:统计字符出现次数
下面的示例演示了如何使用散列表统计字符出现的次数。
counts = {}
text = 'Hello, World!'
# 统计字符出现次数
for char in text:
if char in counts:
counts[char] += 1
else:
counts[char] = 1
# 输出结果
for char, count in counts.items():
print(f'{char}: {count}')
输出结果:
H: 1
e: 1
l: 3
o: 2
,: 1
: 1
W: 1
r: 1
d: 1
!: 1
示例2:统计单词出现次数
下面的示例演示了如何使用散列表统计单词出现的次数。
counts = {}
text = 'Like a bird on the wire,\nLike a drunk in a midnight choir,\nI have tried in my way to be free.'
# 统计单词出现次数
for word in text.split():
if word in counts:
counts[word] += 1
else:
counts[word] = 1
# 输出结果
for word, count in counts.items():
print(f'{word}: {count}')
输出结果:
Like: 1
a: 2
bird: 1
on: 1
the: 2
wire, Like: 1
drunk: 1
in: 2
midnight: 1
choir, I: 1
have: 1
tried: 1
my: 1
way: 1
to: 1
be: 1
free.: 1