python - 对字典中的嵌套列表进行排序
问题描述
在给定的字典示例中:
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]]}
解决方案
您可以制作一个纯 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]]}
推荐阅读
- android - 无法创建渐变材质设计按钮
- javascript - 使用 Javascript 做一些数学计算来计算范围
- javascript - React Native Side Menu (Navigator) 不覆盖整个屏幕
- angular - 正确使用 Angular /typsecript 用选定的对象填充数组
- ruby - 如何运行安装在替代路径上的 ruby 包?
- javascript - 使用 async/await 并得到“未能在 'response' 主体流上执行 'json' 被锁定在 eval”错误
- java - Java 变量超出范围,即使我已经在类中声明了它?
- c++ - 插件类未包含在 UE4 构建中
- python - 如何使用内联的 Jupyter 选项启动 pyspark?
- authentication - Shopify:以客户身份登录