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

  • Post category:Python

下面就为你详细讲解Python 字典、映射和散列表的使用方法。

Python字典

Python字典是一种无序、可变的数据类型,可以存储任意数量的Python对象,每个对象都被认为是一个键值对。字典中的键必须是不可变对象,值可以是任何对象。

创建字典

用花括号 {} 或者 dict() 函数来创建一个空字典。

d = {}
d = dict()

也可以使用 {key: value} 的方式来创建具有初始值的字典。

d = {'apple': 2, 'banana': 3, 'orange': 1}

字典基本操作

访问字典中的值

使用键来访问字典中的值。

d = {'apple': 2, 'banana': 3, 'orange': 1}
print(d['apple'])  # 2

当使用未知的键访问时会引发 KeyError 错误,为了避免这种情况,使用 get 方法来访问。

print(d.get('watermelon', 0))  # 0

修改字典

使用键来修改字典中的值。

d = {'apple': 2, 'banana': 3, 'orange': 1}
d['apple'] = 3
print(d)  # {'apple': 3, 'banana': 3, 'orange': 1}

删除字典元素

使用 del 关键词来删除字典中指定的元素。

d = {'apple': 2, 'banana': 3, 'orange': 1}
del d['orange']
print(d)  # {'apple': 2, 'banana': 3}

字典方法

keys()、values() 和 items() 方法

  • keys() 方法返回字典中所有键的列表。
  • values() 方法返回字典中所有值的列表。
  • items() 方法返回字典中所有键值对的列表。
d = {'apple': 2, 'banana': 3, 'orange': 1}
print(list(d.keys()))  # ['apple', 'banana', 'orange']
print(list(d.values()))  # [2, 3, 1]
print(list(d.items()))  # [('apple', 2), ('banana', 3), ('orange', 1)]

pop()、popitem() 和 clear() 方法

  • pop(key[,default]) 方法删除指定键,如果键不存在,则返回默认值或者引发 KeyError 错误。
  • popitem() 方法随机删除并返回一个键值对。
  • clear() 方法清空字典。
d = {'apple': 2, 'banana': 3, 'orange': 1}
d.pop('banana')
print(d)  # {'apple': 2, 'orange': 1}

print(d.popitem())  # ('orange', 1)
print(d)  # {'apple': 2}

d.clear()
print(d)  # {}

映射类型

除了字典,Python中还有映射类型,如 defaultdictOrderedDictCounter 等。

defaultdict

collections 模块中的 defaultdict 是 Python 内置字典的一个子类,提供了一个工厂函数,为字典查询提供默认值。

示例1:统计字符串中每个字符出现的次数

from collections import defaultdict

s = 'hello world'
d = defaultdict(int)
for c in s:
    d[c] += 1
print(d)  # defaultdict(<class 'int'>, {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

示例2:将字符串列表按照首字母分组

from collections import defaultdict

words = ['apple', 'banana', 'orange', 'pear']
d = defaultdict(list)
for w in words:
    d[w[0]].append(w)
print(d)  # defaultdict(<class 'list'>, {'a': ['apple'], 'b': ['banana'], 'o': ['orange'], 'p': ['pear']})

OrderedDict

标准字典的键是无序的,而 collections 模块中的 OrderedDict 是有序字典,保留了键值对添加的顺序。

示例:使用 OrderedDict 将字典按照键的顺序进行排序。

from collections import OrderedDict

d = {'banana': 3, 'orange': 1, 'apple': 2}
sorted_d = OrderedDict(sorted(d.items(), key=lambda x: x[0]))
print(sorted_d)  # OrderedDict([('apple', 2), ('banana', 3), ('orange', 1)])

Counter

collections 模块中的 Counter 是一个专门用来计数的工具类,它可以对序列中出现的元素进行计数。

示例:计算字符串中每个单词出现的次数

from collections import Counter

s = 'this is a test sentence this is only a test'
words = s.split()
c = Counter(words)
print(c)  # Counter({'this': 2, 'is': 2, 'a': 2, 'test': 2, 'sentence': 1, 'only': 1})

散列表

Python 内置字典的底层实现就是散列表,散列表提供了一种快速的键值存取方式,可以快速地根据键来查找值。

散列表的原理是:通过一个哈希函数将键转化为它的哈希值,并将该值用于查找一个表中的桶,桶中包含了与该键对应的值。

Python 中的散列表可以通过 hash() 函数获取键的哈希值。

示例:将列表中相邻数字对的和存入字典中

numbers = [1, 2, 3, 4, 5, 6]
d = {}
for i in range(len(numbers)-1):
    d[hash((numbers[i], numbers[i+1]))] = numbers[i] + numbers[i+1]
print(d)  # {-6606413658506001946: 3, -6194340078637518606: 5, -5804568676126658410: 7, 4670544141622732996: 9, 9882563297322483506: 11}

以上就是Python中字典、映射和散列表的使用方法,希望能对你有所帮助。