给定一个字典
d
,既然我们知道自 Python 3.7 以来(插入)顺序被保留,是否有一种内置方法来要求 具有相同键的相同字典,除了某些键 k1、k2、 ...应该先来吗?
示例:
a
(如果存在)应该是第一个,first
(如果存在)接下来应该出现我想出了这个:
def reorder_dict(d, first_keys):
new_keys = [k for k in first_keys if k in d.keys()] + [k for k in d.keys() if k not in first_keys]
new_d = {k: d[k] for k in new_keys}
return new_d
d1 = {"c": 3, "b": 2, "a": 1}
reorder_dict(d1, ["a", "first"]) # {'a': 1, 'c': 3, 'b': 2} as expected ; NB: "first" is not present
有没有内置的方法可以更直接地做到这一点?
我会使用元组排序键来做到这一点,它看起来像这样:
>>> data = dict.fromkeys(["first", "b", "a"])
>>> data
{'first': None, 'b': None, 'a': None}
>>> {k: data[k] for k in sorted(data, key=lambda x: (x != "a", x != "first"))}
{'a': None, 'first': None, 'b': None}
由于Python的排序是稳定的,不在键“a”或“first”下的项目不应该移动 - 它们的排序键将都是相同的元组(True,True)。
是的,您可以使用集合模块中的 OrderedDict 类来实现此目的。您可以创建一个新的 OrderedDict,在其中显式指定键的顺序,确保特定键排在前面。这是一个例子:
from collections import OrderedDict
# Your original dictionary
d = {'b': 2, 'c': 3, 'a': 1, 'first': 0}
# Define the order of keys
desired_order = ['a', 'first']
# Create a new OrderedDict with the desired order
ordered_d = OrderedDict((key, d[key]) for key in desired_order if key in d)
# Add remaining keys in their original order
for key in d:
if key not in ordered_d:
ordered_d[key] = d[key]
print(ordered_d)