0

我已经尝试了所有我能想象的,但似乎无法得出一个有效的解决方案。

我需要根据它们的 ID 对一组类对象进行排序,以便该 ID 与另一个列表中的相同。

class Item:
  def __init__(self,i):
    self.i = i

itemList = [Item(2),Item(1),Item(4),Item(3)]
indexList = [3,1,2,4]

预期输出:

itemList_sorted = [Item(3), Item(1), Item(2), Item(4)]

我在这里看到了一个类似的强烈反对的问题但该解决方案对我没有帮助,因为我不能使用函数并且需要将每个项目的成员与另一个数组中的索引进行比较。

itemList.sort(key=lambda x: x.i - indexList.index) # Wrong
itemList.sort(key=indexList.index,cmp=lambda x,y: x.i==y) # Wrong

有没有一种 Pythonic 方法可以在不诉诸 C 类循环的情况下完成此操作?

提前感谢您的帮助!

4

3 回答 3

2

使用sorted(..., key)

sorted(itemList, key=lambda item: indexList.index(item.i))
于 2013-04-18T15:22:55.520 回答
2

如果您可以假设 indexlist 中的每个索引都是iItem的一个,那么您可以作弊并按顺序创建它们:

itemList = [Item(i) for i in indexList]

如果这不是一个选项,您可以排序:

itemList.sort(key=lambda x: indexList.index(x.i))
于 2013-04-18T15:25:22.313 回答
1

其他答案解决了如何正确进行排序 - 但我觉得你在这里采取了错误的方法。为什么不只是建立一个新列表而不是尝试对旧列表进行排序?

[next(y for y in itemList if y.i == x) for x in indexList]

请注意,这实际上应该比 using 更快sort,后者必须indexList为每个O(n log n)比较搜索一次。

于 2013-04-18T15:36:32.590 回答