【问题标题】:Python ordering the list according to another list [duplicate]Python根据另一个列表对列表进行排序[重复]
【发布时间】:2013-09-12 09:16:30
【问题描述】:

我想根据存储顺序的另一个列表(myorderList)订购myList。例如,myorderList=[3,1,2] 表示myList 的第一个元素映射为“二”,因为myorderList 中最小的数字是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

结果:

['two', 'one', 'zero']

【问题讨论】:

  • 列表myorderList 是否总是一个连续索引的列表,或者它也可能是类似[13, 7, 42] 的东西?
  • 不一定,可能是你说的列表。

标签: python


【解决方案1】:

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

>>> [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() 实现会遍历列表并为每个项目调用 key 函数。上面给出的 key 函数忽略了它的参数并简单地从 myorderList 返回下一个项目,这导致所需的密钥用于 myList 的每个元素。在此之后,sorted() 根据之前确定的键对列表进行排序。

【讨论】:

  • 你能解释一下你的第二个例子中发生了什么吗?
  • 很酷的答案,但我总是会推荐第一个选项而不是第二个选项。我认为它一目了然更具可读性。
  • @abc:我加了一点解释。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2018-09-15
  • 1970-01-01
  • 2018-11-15
  • 2014-05-28
相关资源
最近更新 更多