Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据另一个列表中元素的索引对列表进行排序_Python_List_Sorting_Indexing - Fatal编程技术网

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索引,它会在两个数组之间循环。