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已经迭代过的项目.
试试这个:
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分拣过程中进行搜索.这对性能肯定不是很好,所以不要怪我;-)
关键是要意识到项目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)