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

nr.*_*r.o 0 python sorting algorithm list

特定

a = [1,4,5,3,2,6,0]
b = ['b','e','f','d','c','g','a']
Run Code Online (Sandbox Code Playgroud)

为了b到位,预期的顺序b是在相应位置元件可用a.

输出将是

['a','b','c','d','e','f','g']
Run Code Online (Sandbox Code Playgroud)

尝试其他类似的输入集.

a = [4,0,1,3,2]
b = ['E','A','B','D','C']
Run Code Online (Sandbox Code Playgroud)

我可以得到它使用第三列表完成,甚至sorted()创建第三列表,但关键是要排序b到位

print sorted(b,key=lambda bi : a[b.index(bi)])
Run Code Online (Sandbox Code Playgroud)

问题的核心是如何防止迭代b已经迭代过的项目.

Alf*_*lfe 6

试试这个:

zip(*sorted(zip(a, b)))[1]
Run Code Online (Sandbox Code Playgroud)

应该给:

('a', 'b', 'c', 'd', 'e', 'f', 'g')
Run Code Online (Sandbox Code Playgroud)

因为在排序过程中,b它本身似乎是空的(请参阅我的问题),您可以使用该段代码就地执行此操作:

b.sort(key=lambda x, b=b[:]: a[b.index(x)])
Run Code Online (Sandbox Code Playgroud)

这将使用拷贝b分拣过程中进行搜索.这对性能肯定不是很好,所以不要怪我;-)


Joh*_*ooy 5

关键是要意识到项目b对关键功能的用处不大.你对他们的同行很感兴趣a.要在适当的位置执行此操作,意味着您不能仅仅使用zip配对项目.这里我使用默认参数技巧将一个迭代器a放到lambda函数中.

>>> 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']
Run Code Online (Sandbox Code Playgroud)