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

Cのようなループに頼らずにこれを達成するためのPython的な方法はありますか?

助けてくれてありがとう!

4

3 に答える 3

2

使用sorted(..., key):

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

indexlist 内のすべてのインデックスがiあなたItemのものであると仮定できる場合は、それらをごまかして順番に作成できます。

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]

これは、 O(n log n)の比較ごとに を 1 回sort検索する必要がある を使用するよりも実際には高速であることに注意してください。indexList

于 2013-04-18T15:36:32.590 に答える