给出
a = [1,4,5,3,2,6,0]
b = ['b','e','f','d','c','g','a']
订购b
,b
的预期订单在a
的相应位置元素中可用。
输出
['a','b','c','d','e','f','g']
尝试其他类似的输入集。
a = [4,0,1,3,2]
b = ['E','A','B','D','C']
我可以使用第三个列表完成它,即使sorted()
创建了第三个列表,但关键是要对b
进行排序
print sorted(b,key=lambda bi : a[b.index(bi)])
问题的核心是如何防止迭代b
中已经迭代过的项目。
答案 0 :(得分:6)
试试这个:
zip(*sorted(zip(a, b)))[1]
应该给:
('a', 'b', 'c', 'd', 'e', 'f', 'g')
由于在排序期间b
本身似乎是空的(请参阅my question about that),您可以使用该段代码进行就地执行:
b.sort(key=lambda x, b=b[:]: a[b.index(x)])
这使用b
的副本在排序期间搜索。这对表现来说当然不是很好,所以不要怪我; - )
答案 1 :(得分: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']
答案 2 :(得分:1)
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
答案 3 :(得分:0)
简单的冒泡排序:
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]