在字典中对嵌套列表进行排序

时间:2019-06-03 16:20:24

标签: python python-3.x

在给定的字典示例中:

a)param1键嵌套列表如何排序(?)-仅子列表,父列表不受影响。 b)由于param1param2中的子列表相互关联,因此param1中的任何排序更改都应反映在param2中。

请注意,仅对param1进行了排序,归因于排序的任何更改都应反映在param2中,因此,例如,如果第一个子列表param1成为第二个索引,则{ {1}}应该具有相同的索引元素交换。

输入:

param2

预期输出:

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

2 个答案:

答案 0 :(得分:2)

您可以创建一个纯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]]}

答案 1 :(得分:1)

如果要对父词典的值中的所有子列表进行排序,请尝试以下方法:

dout = {k : [sorted(i) for i in v] for k,v in din.items()}

输出

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

以下是根据排序的'param2'键值的位置重新排列'param1键子列表中的项目的代码:

dout = {}
dout['param1'] = [list(zip(*sorted(zip(i,j)))[0]) for i,j in zip(din['param1'], din['param2'])]
dout['param2'] = [list(zip(*sorted(zip(i,j)))[1]) for i,j in zip(din['param1'], din['param2'])]

输出

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