我想根据存储其顺序的另一个列表(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
答案 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()
根据先前确定的密钥对列表进行排序。