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

Python ordering the list according to another list

本问题已经有最佳答案,请猛点这里访问。

我想根据存储它的顺序的另一个列表(myorderList)来订购myList。例如,myorderlist=[3,1,2]表示myList的第一个元素映射到"2",因为在myorderList中最小的数字是1,然后根据myorderList的顺序映射到"0"的"1"和最后一个元素。

我已经做到了,但我觉得这不是一个好的方法来映射myList的顺序。我正在寻找更好的方法。

1
2
3
4
5
6
7
8
9
10
    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
['two', 'one', 'zero']


一个选项是将两个列表压缩在一起,排序,并只从结果中提取您感兴趣的位:

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

另一个选项是使用自定义键函数,以正确的顺序返回顺序键:

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

python保证按正确的顺序对输入列表中的每个项调用一次键函数。

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