详解Python 字典、映射和散列表

  • Post category:Python

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

defaultdictdict 的一个子类,它重写了一个方法 __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