在给定的字典示例中:
a)param1
键嵌套列表如何排序(?)-仅子列表,父列表不受影响。
b)由于param1
和param2
中的子列表相互关联,因此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]]}
答案 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]]}