Python 根据另一个列表中元素的索引对列表进行排序
我有以下清单:Python 根据另一个列表中元素的索引对列表进行排序,python,list,sorting,indexing,Python,List,Sorting,Indexing,我有以下清单: A = [0.9,0.8,...,0.1,0.0] 以及另一份名单: B = [8, 16, 53, 3, 6, 32, 1, 7, 0, 35] 如何使排序后的列表与另一个列表相似,从而使第二个列表中的最大值具有与第一个列表相同的索引 我想对列表进行如下排序: 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
A = [0.9,0.8,...,0.1,0.0]
以及另一份名单:
B = [8, 16, 53, 3, 6, 32, 1, 7, 0, 35]
如何使排序后的列表与另一个列表相似,从而使第二个列表中的最大值具有与第一个列表相同的索引
我想对列表进行如下排序:
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中,最好是在一行中,这怎么可能呢
谢谢大家 您可以执行以下操作:
创建两个列表的新版本,并进行排序
使用字典将B
的排序值映射到A
的排序值
为B
中的每个值建立一个新版本的a\u排序依据,在B
中查找相应的值
值=[5,8,1,3]
键=[0.1,0.4,0.3,0.2]
已排序的值=已排序的(值)
已排序的\u键=已排序的(键)
合并=dict(zip(已排序的\u键、已排序的\u值))
结果=[已合并[键]用于键入键]
这使得:
>>键
[0.1, 0.4, 0.3, 0.2]
>>>结果
[1, 8, 5, 3]
在一条线上安装它
如果必须,您可以将这些语句组合成两行,如下所示:
merged=dict(zip(已排序(键)、已排序(值)))
结果=[已合并[键]用于键入键]
(或者甚至在其中,通过内联合并)。但你会失去可读性
如何独自解决这个问题
你自己弄明白这一点的关键是要认识到,你需要创建一种方法来查找排序列表中任何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的建议,我不知道如何为list
s这样做,但是如果这些是numpy数组,我会使用argsort
。Numpy数组可以用索引数组重新排列,argsort
可以给出排序B
的B
索引。除非在这种情况下,你会用这些索引重新排列A
,比如A[np.argsort(B)]
谢谢,我会研究一下“argsort”,但A[np.argsort(B)]
没有给出答案argsort
重新排列B的索引以匹配排序后的B,但您需要重新排列排序后的B的索引以匹配B。我找到的答案是[np.argsort(np.argsort(B))]@BatWannaBe lookup my answer。我对你的建议有点曲解。结果是非常好。谢谢这是可行的,尽管它在O(n^2)中运行。通过将index
调用替换为字典中的查找(例如,在我的回答中),您可以从两种排序中将运行时降到O(n log n)。使用id
作为变量名也是不可取的,因为它是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu内置函数中的一个函数。谢谢,但如果我没有,我宁愿不使用for循环,如果可能的话,避免缩进并保存运行时感谢详细的回答!在MATLAB中有一个更简单的解决方案:还有另一个可能的排序输出-排序的索引:称它为:idx如果你对这个idx进行排序,并取这个排序的idx2,你会得到排序的倒数。如果你使用[idx2]并得到对应于BI的A,我将尝试使用你的想法并提出类似于MATLAB版本的东西。如果不使用字典,您将如何内联合并?您应该将其标记为供其他人查看的解决方案。这让我非常惊讶,但我有点明白它为什么会起作用:重新排列sort(B)
以匹配B
与将argsort(B)
重新排列为arange(len(B))
,这只是排序(argsort(B))
。因此,要获取该排序的索引,需要执行argsort(argsort(B))
。有趣的是,如果只保留argsort
ing索引,它会在两个数组之间循环。