Skip to content

字典

字典 (Dictionary) 是 Python 中一种常用的数据结构,它以键值对 (key-value pair) 的形式存储数据。每个键必须是唯一的,并且与一个值关联。字典是无序的,这意味着键值对的顺序是不确定的。

字典的创建

使用花括号 {} 创建

python
my_dict = {"name": "Alice", "age": 30, "city": "Beijing"}
print(my_dict)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'Beijing'}

使用 dict() 函数创建

python
my_dict = dict(name="Bob", age=25, city="Shanghai")
print(my_dict)  # 输出: {'name': 'Bob', 'age': 25, 'city': 'Shanghai'}

字典的访问

使用键

使用方括号 [] 和键来访问与键关联的值。

python
print(my_dict["name"])  # 输出: Alice

使用 get() 方法

更安全的方式,如果键不存在,返回 None

python
print(my_dict.get("job"))             # 输出: None
print(my_dict.get("job", "Unknown"))  # 输出: Unknown (指定默认值)

字典的修改

使用键和赋值运算符: 直接修改与键关联的值。

python
my_dict["age"] = 31
print(my_dict)  # 输出: {'name': 'Alice', 'age': 31, 'city': 'Beijing'}

字典的添加

使用键和赋值运算符: 添加新的键值对。

python
my_dict["job"] = "Software Engineer"
print(my_dict)  # 输出: {'name': 'Alice', 'age': 31, 'city': 'Beijing', 'job': 'Software Engineer'}

字典的删除

使用 del 关键字

python
del my_dict["city"]
print(my_dict)  # 输出: {'name': 'Alice', 'age': 31, 'job': 'Software Engineer'}

使用 pop() 方法

python
city = my_dict.pop("job")
print(city)     # 输出: Software Engineer
print(my_dict)  # 输出: {'name': 'Alice', 'age': 31}

字典的合并

字典合并指的是将两个或多个字典的内容合并成一个新的字典。Python 提供了多种方法实现字典合并,每种方法都有其优缺点:

使用 update() 方法

update() 方法将另一个字典的内容更新到当前字典中。如果两个字典中存在相同的键,则使用另一个字典中的值覆盖当前字典中的值。

python
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

dict1.update(dict2)
print(dict1)  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

使用解包运算符 **

解包运算符 ** 可以将字典展开,将其中的键值对合并到新的字典中。

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

merged_dict = {**dict1, **dict2}
print(merged_dict)  # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

使用 collections.ChainMap

collections.ChainMap 类可以将多个字典链接在一起,形成一个新的视图。当访问键时,它会依次查找每个字典,直到找到匹配的键。

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

merged_dict = ChainMap(dict1, dict2)
print(merged_dict['a'])  # 输出: 1
print(merged_dict['c'])  # 输出: 3
print(merged_dict)       # 输出: ChainMap({'a': 1, 'b': 2}, {'c': 3, 'd': 4})

注意事项

  • update() 方法会修改原字典,而解包运算符和 ChainMap 则不会修改原字典。
  • 如果两个字典中有相同的键,使用 update() 和解包运算符会使用后一个字典的值覆盖前一个字典的值。
  • ChainMap 不会真正合并字典,而是创建了一个新的视图,当访问键时会依次查找每个字典。

字典的排序

字典本身是无序的,但我们可以使用一些方法将字典按照键或值进行排序。

按照键排序

python
my_dict = {'c': 3, 'a': 1, 'b': 2}

sorted_keys = sorted(my_dict)
print(sorted_keys)  # 输出: ['a', 'b', 'c']

按照值排序

可以使用 sorted() 函数结合 items() 方法,对字典的键值对按照值进行排序。

python
my_dict = {'c': 3, 'a': 1, 'b': 2}

sorted_items = sorted(my_dict.items(), key=lambda item: item[1])
print(sorted_items)  # 输出: [('a', 1), ('b', 2), ('c', 3)]

使用 collections.OrderedDict

collections.OrderedDict 类可以保留字典元素插入的顺序。

python
from collections import OrderedDict

my_dict = OrderedDict([('c', 3), ('a', 1), ('b', 2)])
print(my_dict)  # 输出: OrderedDict([('c', 3), ('a', 1), ('b', 2)])

注意事项

  • sorted() 函数创建的是一个新的排序后的列表,不会修改原字典。
  • OrderedDict 保留插入顺序,但无法根据键或值进行排序。

字典其他常见操作

keys() : 获取字典中的所有键

keys = my_dict.keys()
print(keys)    # 输出: dict_keys(['name', 'age'])

values() : 获取字典中的所有值

python
values = my_dict.values()
print(values)  # 输出: dict_values(['Alice', 31])

items() : 获取字典中所有键值对

python
items = my_dict.items()
print(items)  # 输出: dict_items([('name', 'Alice'), ('age', 31)])

len() 函数: 获取字典中键值对的数量

python
length = len(my_dict)
print(length)  # 输出: 2

in 运算符: 检查字典中是否存在某个键

python
if "name" in my_dict:
    print("The key 'name' exists")

总结

字典是 Python 中非常强大的数据结构,它提供了一种灵活、高效的方式来存储和访问数据。通过掌握字典的基本操作,我们可以更方便地处理各种数据,并提高代码的效率。

Released under the MIT License.