Python根据另一个列表排序列表

时间:2013-09-08 21:27:47

标签: python

我想根据存储其顺序的另一个列表(myList)来订购myorderList。例如,myorderList = [3,1,2]表示myList的第一个元素被映射到“2”,因为myorderList中的最小数字是1,然后是“1”并且最终元素被映射根据{{​​1}}的顺序为“零”。

我已经这样做了它有效,但我觉得这不是映射myorderList顺序的好方法。我正在寻找一种更好的方法来做到这一点。

myList

结果:

    myorderList=[]
    myneworderedList=[]
    myList=["zero","two","one"]
    myorderList=[3,1,2]
    for i in range(len(myList)):# just to eliminate index out of range error
        myneworderedList.append(i)

    for index,item in enumerate(myorderList):
        myneworderedList[int(item)-1]=myList[index]
    print myneworderedList

1 个答案:

答案 0 :(得分:4)

一种选择是将两个列表压缩在一起,排序,并仅从结果中提取您所关注的位:

>>> [y for x, y in sorted(zip(myorderList, myList))]
['two', 'one', 'zero']

另一种选择是使用自定义键功能,以正确的顺序返回订单键:

>>> it = iter(myorderList)
>>> sorted(myList, key=lambda x: next(it))
['two', 'one', 'zero']

Python保证每个输入列表项都按顺序调用一次键函数。

更具体地说,在开始对输入列表进行排序之前,sorted()实现迭代列表并调用每个项的键函数。上面给出的关键函数忽略了它的参数,只是返回myorderList中的下一个项,这导致所需的键被用于myList的每个元素。在此之后,sorted()根据先前确定的密钥对列表进行排序。