繁体   English   中英

根据另一个列表中元素的索引对列表进行排序

[英]Sort a list according to the index of the elements in another list

我有以下列表:

A = [0.9,0.8,...,0.1,0.0]

和另一个清单:

B = [8, 16, 53, 3, 6, 32, 1, 7, 0, 35] 

如何制作一个类似于另一个列表的排序列表,以便第二个列表中的最大值与第一个列表具有相同的index

我想像这样对列表 A 进行排序:

A_sorted = [0.5, 0.6, 0.9, 0.2, 0.3, 0.7, 0.1, 0.4, 0.0, 0.8]
{B       = [8  , 16 , 53 , 3  , 6  , 32 , 1  , 7  , 0  , 35 ]} 

这怎么可能在 Python 中,最好是一行?

谢谢大家!

您可以执行以下操作:

  1. 创建两个列表的新版本,排序
  2. map 使用字典将B的排序值转换为A的排序值
  3. B中的每个值构建一个新版本的A_sorted by,在B中查找相应的值。
values = [5, 8, 1, 3]
keys = [0.1, 0.4, 0.3, 0.2] 
sorted_values = sorted(values)
sorted_keys = sorted(keys)
merged = dict(zip(sorted_keys, sorted_values))
result = [merged[key] for key in keys]

这给出了:

>>> keys
[0.1, 0.4, 0.3, 0.2]
>>> result
[1, 8, 5, 3]

将其安装在一条线上

如果必须,您可以将这些语句组合成两行,例如:

merged = dict(zip(sorted(keys), sorted(values)))
result = [merged[key] for key in keys]

(甚至在一个中,通过内联合merged )。 但是你失去了可读性。

如何自己解决这个问题

自己解决这个问题的关键是意识到您需要创建一种方法来查找任何b排序列表中a的相应值。 一旦你意识到这一点,你就会意识到你需要一个从排序 b 到排序 a 的字典。

试试下面的代码:

a = [2,3,5,6,7]
b = [7,2,3,4,5]
sorted_b = sorted(b)
sorted_a = sorted(a)
for id,i in enumerate(sorted_b):
    idx = b.index(i)
    a[idx] = sorted_a[id]
print(a)

我找到的答案是将 B 的索引再排序一次以获得逆排序索引(原始向量中的每个变量在哪里),而不是将其用作新向量的索引,如下所示:

A[np.argsort(np.argsort(B))]

我使用了@batwannabe 的建议

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM