Python 使用另一个索引列表对列表进行排序

Python 使用另一个索引列表对列表进行排序,python,algorithm,list,sorting,Python,Algorithm,List,Sorting,给定 顺序b就位后,b的预期顺序在a的相应位置元素中可用 输出将是 a = [1,4,5,3,2,6,0] b = ['b','e','f','d','c','g','a'] 尝试其他类似的输入集 ['a','b','c','d','e','f','g'] 我可以使用第三个列表来完成它,即使sorted()创建了第三个列表,但关键是排序b a = [4,0,1,3,2] b = ['E','A','B','D','C'] 问题的核心是如何防止对b中已迭代的项进行迭代。尝试以下方法: pri

给定

顺序
b
就位后,
b
的预期顺序在
a
的相应位置元素中可用

输出将是

a = [1,4,5,3,2,6,0]
b = ['b','e','f','d','c','g','a']
尝试其他类似的输入集

['a','b','c','d','e','f','g']
我可以使用第三个列表来完成它,即使
sorted()
创建了第三个列表,但关键是排序
b

a = [4,0,1,3,2]
b = ['E','A','B','D','C']
问题的核心是如何防止对
b
中已迭代的项进行迭代。

尝试以下方法:

print sorted(b,key=lambda bi : a[b.index(bi)])
应提供:

zip(*sorted(zip(a, b)))[1]
由于在排序过程中,
b
本身似乎是空的(请参阅),因此您可以使用该段代码就地进行排序:

('a', 'b', 'c', 'd', 'e', 'f', 'g')
这将在排序期间使用
b
的副本进行搜索。这对性能肯定不是很好,所以不要怪我;-)

简单气泡排序:

b.sort(key=lambda x, b=b[:]: a[b.index(x)])

关键是要意识到
b
中的项目对键功能没有多大用处。您对
a
中的对应项感兴趣。要在原地执行此操作,意味着您不能仅使用
zip
将项目配对。在这里,我使用默认参数技巧将
a
上的迭代器引入lambda函数

for i in range( len(a) ):
    for j in range(len(a)-1-i):
         if (a[j] > a[j+1]):
             #swap a[j] & a[j+1]
             #swap b[j] & b[j+1]

要进行适当排序,您可以使用
.sort()
B=dict((v,i)表示枚举(B)中的i,v))
可以帮助您,如果列表中有唯一的元素,您可以同时对两个列表进行简单的冒泡排序。
.sort()
还接受
参数。不要忘记B.index(bi)在O(n)中运行,这会将排序速度降低到O(n^2 log n)。这比泡泡式更糟糕。此外,如果
a
包含重复的项目,则它不起作用。但对于
b
,这当然不适用。所以你可能不想用它,这很奇怪。我尝试了
b.sort(key=lambda x:a[b.index(x)])
,发现在排序过程中,b似乎是一个空列表。我将此效果发布为a。没错,b在排序过程中变为空。我想讨论一下,并给出点意见,因此,请访问上面提到的问题:)是否由
.sort
保证键函数将按顺序调用,并且每个项仅调用一次?我强烈支持@Eric的问题(因此发表了这一评论)。有这样的保证吗?否则,由于排序算法的实现细节,该解决方案只能起作用。事实上,我很惊讶键函数的使用方式是这样的(这里非常合适)。@Alfe,这是个好问题。我现在没有时间去寻找一个权威的答案。也许你可以提出一个新问题,获得比我更多的听众。我对答案也很感兴趣。很好,这要求a和b。如果我们只想b@nr.o我认为这是不可能的。您需要跟踪已排序的周期,因为它们的编号为O(n),所以需要很多位置。否则,很好的解决方案M4rtini,我花了一些时间从我的记忆中找出了算法101,这些年来丢失了:D
>>> a = [1,4,5,3,2,6,0]
>>> b = ['b','e','f','d','c','g','a']
>>> b.sort(key=lambda x, it=iter(a): next(it))
>>> b
['a', 'b', 'c', 'd', 'e', 'f', 'g']
def sorter(a,b):
    for i in range(len(a)):
        while i != a[i]:
            ai = a[i]
            b[i], b[ai], a[i], a[ai] = b[ai], b[i], a[ai], a[i]
    return b