根据另一个字典的值对列表字典进行排序

时间:2021-02-26 16:18:14

标签: python sorting dictionary

我有一个以下形式的列表字典:

dict1 = { key1 : ['a', 'b'], key2: ['c', 'd'], key3: ['e']}

我有另一本形式的字典

dict2 = { a: 10, b: 11, c: 6, d: 15, e: 3}

我想根据 dict 2 的值以相反的顺序对 dict1 进行排序,因此结果将类似于:

sorted_dict = { key2:['d', 'c'], key1: ['b', 'a'], key3:['e']}

编辑:我需要保留键的顺序。我也可以将其转换为元组,这是完全可以接受的。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以在 key 中使用 sorted 参数:

sorted_dict = {}

for k in dict1:
    sorted_dict[k] = sorted(dict1[k], key=lambda v: dict2[v], reverse=True)

这给出:

{'key1': ['b', 'a'], 'key2': ['d', 'c'], 'key3': ['e']}

答案 1 :(得分:1)

要对字典值进行排序,您可以执行以下操作:

sorted_dict = {
    key: sorted(value, key=lambda x: dict2.get(x, 0), reverse=True)
    for key, value in dict1.items()
}

然后对字典进行排序(更改键的顺序),您可以这样做:

sorted_dict = dict(
    sorted(
        sorted_dict.items(),
        key=lambda x: sum(dict2.get(i, 0) for i in x[1]),
        reverse=True,
    )
)

关于 dictionary 中键顺序的旁注。

<块引用>

字典保留插入顺序。请注意,更新密钥确实 不影响订单。删除后添加的键插入 结束。

3.7 版更改:字典顺序保证插入 命令。此行为是 CPython 3.6 的实现细节。

答案 2 :(得分:0)

您不能对字典进行排序,但可以对列表进行排序。我建议采用与我在下面所做的类似的方法,在映射来自 dict2 的值之后对键进行排序,然后从排序的键创建一个新的 unordered 字典。

dict1 = { "key1" : ['a', 'b'], "key2": ['c', 'd'], "key3": ['e']}
dict2 = { "a": 10, "b": 11, "c": 6, "d": 15, "e": 3}
sorted_keys = sorted([key for key in dict1], key=lambda x: sum([dict2[el] for el in dict1[x]]), reverse=True)
sorted_dict = {k: dict1[k] for k in sorted_keys}

这会产生

{'key1': ['b', 'a'], 'key2': ['d', 'c'], 'key3': ['e']}

按映射值排序