Pythonの:ラムダ関数とカスタム定義された順序でユーザー定義オブジェクトのオブジェクトの属性で並べ替えます、

まる1週間 :

私は2つの(重要な)属性、状態コード(TX、CA、NY、など)と学年レベル(PK = PREK、ES =小学校など)を持つカスタムオブジェクトのリストを持っています。私は、状態コードのアルファベット順、その後、グレードによってこのリストをソートする必要があります。私が今持っていることはこれです:

class myObject:
    def __init__(self, state, grade):
        self.state = state 
        self.grade = grade

myObjects = []
myObjects.append(myObject("KY", "HS"))
myObjects.append(myObject("AL", "ES"))
myObjects.append(myObject("NY", "PK"))
myObjects.append(myObject("CA", "PK"))

possibleGrades = ["PK", "K", "ES", "MS", "HS"]
myObjects.sort(key=lambda x: (x.grade, x.state))

for x in myObjects:
    print("Grade: {}, State: {}".format(x.grade, x.state))

出力:

Grade: ES, State: AL
Grade: HS, State: KY
Grade: PK, State: CA
Grade: PK, State: NY

私が欲しいのです。

Grade: PK, State: CA
Grade: PK, State: NY
Grade: ES, State: AL
Grade: HS, State: KY

私はpossibleGradesするソートの順序を指定する方法を見つけ出すことはできませんので、私はグレードと、状態によってソートしmyObjectsを持っていますが、小学校を置くことはPREKの前にあります。私は、それがここで使われているよう.INDEX使用する方法があることを知っているhttps://www.geeksforgeeks.org/python-sort-list-according-to-other-list-order/カスタムオーダーでソートするが、しかし私缶オブジェクトの属性をどのように行うかは」トンの図。それはのようなものでなければなりませんように思えます。

standards.sort(key=lambda x: (x.grade, x.state) possibleGrades.index(x))

または、2回のパスで:

standards.sort(key=lambda x: x.grade possibleGrades.index(x))
standards.sort(key=lambda x: x.state)

しかし、これらは動作しません。私はあなたがソート複数のパスを持つだけで、最新の繰り返しだと、複数の属性によって、私は、1回のパスでそれを行うに装着されていないよソートすることができることを知って、それがPythonがすることができるかもしれないという事のようなものとして私を打ちます行う。最悪のシナリオは、私はそれをソートするデフと全体の関数を書くことができますが、私はそれを行う前に、私がやろうとしているようにラムダでそれをソートするためのいくつかのより多くのPython的な方法はありますか?

jignatius;

これを試して:

myObjects.sort(key=lambda x: (possibleGrades.index(x.grade), x.state))

これは、リストにグレードのインデックスでソートしpossibleGradesた後の状態で、最初に。

@a_guestで示唆したように、あなたはまた、リストから特に場合は、その大きなリストを辞書を構築し、O(1)検索を行うことができます。その後、コードは次のようになります。

grades = {g: i for i, g in enumerate(possibleGrades)}
myObjects.sort(key=lambda x: (grades[x.grade], x.state))

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=347253&siteId=1