Python字典排序方式及实现

更新时间:2024-04-26 14:11:30   人气:9669
在Python编程语言中,字典是一种非常重要的数据结构,它以键值对的形式存储元素。然而,默认情况下,字典是无序的集合,并不保证其插入顺序或者任何特定排序规则。自 Python 3.7 起,虽然 dictionaries 在内部维护了它们的历史输入顺序(即通常所说的“insertion order”),但这并不等同于进行了明确的排序操作。

尽管如此,在某些场景下我们可能需要得到一个按照某种方式进行排列的有序字典副本。为此,Python提供了多种方法来实现这一需求:

1. **使用 `sorted()` 函数和 dict-comprehension:**
我们可以通过结合 sorted() 和dict comprehension功能按 key 或 value 进行排序创建一个新的、有序的字典对象。例如,若要依据key升序排序:

python

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

# 按照 keys 升序排序:
ordered_dict_by_keys_asc = {k: v for k, v in
sorted(original_dict.items())}

print(ordered_dict_by_keys_asc)
#{'a': 1, 'b': 2, 'c': 5}


2. **`collections.OrderedDict`:** 如果你需要保持添加项时的顺序或手动指定排序,则可以利用内置模块 collections 中提供的 OrderedDictionary 类型。

python

from collections import OrderedDict

unordered_dict = {"banana": 3, "apple":4, "pear": 1, "orange": 2}

# 使用OrderedDict并基于items迭代进行构造:
ordered_dict = OrderedDict(sorted(unordered_dict.items()))

print(ordered_dict)
# 输出:(OrderedDict([('apple', 4), ('banana', 3),
(' orange', 2), (' pear', 1)]))


3. 自定义排序逻辑:以上两种方式都默认为按键进行升序排序。如果你有更复杂的排序要求,比如按照value大小降序排序,你可以通过 lambda 表达式传入比较函数给 sorted 方法。

python

by_value_descending = {
k:v for k,v in sorted(
original_dict.items(), reverse=True, key=lambda item:item[1])
}

print(by_value_descending)
# 若original_dict={'c': 3, 'a': 10, 'b': 6}, 则输出{'a': 10, 'b': 6, 'c': 3}


总结来说,虽然原生Python字典本身不具备自动排序的功能属性,但借助标准库中的工具如 `sorted`, `dict comprehensions` 及 `collections.OrderedDict` 等机制,我们可以方便地生成具有预设排序策略的新字典实例,满足项目开发过程中的多样化需求。