我有两个列表,例如
coords = [2, 0, 1, 4, 3]
value = [1, 9, 3, 3, 0]
其中第一个是一系列坐标,第二个是与坐标对应的一系列值,例如坐标'2'
对应于值'1'
,坐标'0'
给出值'9'
。
现在,我想对坐标
进行排序但保持值
的顺序不变,以便最小的坐标
元素对应于 value
中的最小元素,依此类推。所需的输出将是:
coords_new = [1, 4, 2, 3, 0]
value = [1, 9, 3, 3, 0] # unchanged
其中 '0' -> '0'、'1' -> '1'、'2' -> '3'、'3' -> '3'、'4' -> '9 '
。
有什么想法可以做到这一点吗?您可以返回coords_new
,或将coords
重新排序的索引作为答案。
编辑: 如果可能的话,我更希望我们可以返回重新排序原始坐标的索引,即返回 idx,使得 coords[idx] = coords_new。
非常感谢!
志豪
最佳答案
一种替代方法是首先创建对象之间的映射,然后将此映射与索引结合使用:
coords = [2, 0, 1, 4, 3]
value = [1, 9, 3, 3, 0]
table = {k: v for k, v in zip(sorted(coords), sorted(value))}
print(table)
print(sorted(coords, key=lambda e: value.index(table[e])))
输出
{0: 0, 1: 1, 2: 3, 3: 3, 4: 9}
[1, 4, 2, 3, 0]
注意
此方法假设coords
仅包含唯一值。对于一般情况,您可以生成映射对 (c, v)
并按 value 中 v 的索引值排序:
pairs = [(k, v) for k, v in zip(sorted(coords), sorted(value))]
result = [k for k, _ in sorted(pairs, key=lambda e: value.index(e[1]))]
print(result)
输出
[1, 4, 2, 3, 0]
关于python - 对一个列表进行排序,使两个列表具有正确的顺序对应关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52338454/