首页 > 解决方案 > 对字典中的嵌套列表进行排序

问题描述

在给定的字典示例中:

a)如何对param1键嵌套列表进行排序(?) - 只有子列表,父列表不应该受到影响。b)由于两者中的子列表param1并且param2彼此相关,因此任何排序更改param1都应反映在 中param2

请注意,只有param1排序,任何由于排序引起的变化都应该反映在 中param2,例如,如果第一个子列表param1第二个索引成为第一个,那么param2应该有相同的索引元素交换。

输入:

din = {'param1': [[3, 5, 1], [2, 1], [10, 9, 8, 7]], 'param2': [[1, 2, 3], [1, 2], [1, 2, 3, 4]]}

预期输出:

dout = {'param1': [[1, 3, 5], [1, 2], [7, 8, 9, 10]], 'param2': [[3, 1, 2], [2, 1], [4, 3, 2, 1]]}

标签: pythonpython-3.x

解决方案


您可以制作一个纯 python argsort 数组,该数组将保存已排序项目的索引param1。然后,您可以使用这些索引以正确的顺序提取其他数组中的项目。这假设所有数组都是相同的形状:

din = {'param1': [[3, 5, 1], [2, 1], [10, 9, 8, 7]], 'param2': [[1, 2, 3], [1, 2], [1, 2, 3, 4]]}

# this will hold the indexes corresponding to the sort 
argsort = [[i[0] for i in sorted(enumerate(arr), key = lambda x: x[1])] for arr in din['param1']]

# apply these indexes to each item in dictionary
for key in din:
    din[key] = [[pair[0][i] for i in pair[1]] for pair in zip(din[key], argsort)]

结果

{'param1': [[1, 3, 5], [1, 2], [7, 8, 9, 10]],
 'param2': [[3, 1, 2], [2, 1], [4, 3, 2, 1]]}

推荐阅读