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

时间:2014-03-27 12:06:21

标签: python algorithm list sorting

给出

a = [1,4,5,3,2,6,0]
b = ['b','e','f','d','c','g','a']

订购bb的预期订单在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中已经迭代过的项目。

4 个答案:

答案 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]