簡體   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