使用自定义顺序重新排序字典

问题描述 投票:0回答:2

给定一个字典

d
,既然我们知道自 Python 3.7 以来(插入)顺序被保留,是否有一种内置方法来要求 具有相同键的相同字典,除了某些键 k1、k2、 ...应该先来吗?

示例:

  • a
    (如果存在)应该是第一个,
  • key
    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

有没有内置的方法可以更直接地做到这一点?

python dictionary
2个回答
0
投票

我会使用元组排序键来做到这一点,它看起来像这样:

>>> 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)。


0
投票

是的,您可以使用集合模块中的 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)
© www.soinside.com 2019 - 2024. All rights reserved.