2016-10-10 12 views
1

私はこれに恥ずかしいほど長い時間を費やしましたが、本当にどこも速くはありません。複数のクラスオブジェクトのリストを値で並べ替える

辞書の1つのキーから取得した複数のクラス値のリストをソートする必要があります。 リストは、リスト要素の数が可変で、このようになります。各クラスのオブジェクトで

[<__main__.OrderRecord object at 0x02D357D0>, <__main__.OrderRecord object at 0x02D35850>] 

要素がこの中に含まれていますので、

class OrderRecord: 
    """The OrderRecord class 
    Data attributes: date of type str 
        location of type str 
        name of type str 
        colour of type str 
        ordernum of type int 
        cost of type int 
""" 
def __init__(self, file_line): 
    """Takes a given file line and initialises an OrderRecord instance""" 

    split_file = file_line.split(",") 
    self.date = split_file[0] 
    self.location = split_file[1] 
    self.name = split_file[2] 
    self.colour = split_file[3] 
    self.ordernum = split_file[4] 
    self.costs = self.cost_of_order() 

私はクラスのオブジェクトのリストを取得しようとしているが、「ordernum」などの低番号を昇順で所定の位置にソートします最初。これはクラスオブジェクトの4番目のインデックスです。うまくいけば私はすべての関連情報をここに含めた。

答えて

2

OrderRecordという要素のリストがthe_listとなっているとします。

あなたは使用してインプレース並べ替えることができます。

the_list.sort(key=lambda e : int(e.ordernum)) 

を、あなたがクラスを使用する場合は、そのまま整数にソート・キーを変換する必要がある、またはあなたがしなければならないというコンストラクタで:

self.ordernum = int(split_file[4]) 

その場合、あなたは直接このように並べ替えることができます。

the_list.sort(key=lambda e : e.ordernum) 

はにつながる可能性が整数に変換しませんそれが動作するという誤った仮定だが、アルファベット順に並べ替えます。したがって12513の前になります。これはあなたが望むものではありません。

注:あなたはこのように行うことができます2つのオブジェクトが同じordernumを共有し、あなたは第二の基準追加したい場合(またはそれ以上を...)、以下prioritary(作成attrgetterを使用して、ソートキーとしてタプルを返しますあなたのためのタプル):

the_list.sort(key=lambda e : e.attrgetter(ordernum,name)) 

(今 `)最後はおそらく(operator.attrgetter`とのよりよいだろう

+0

e.ordernumが既に整数型であると仮定。 – alecxe

+0

@alecxeあなたは 'the_list.sort(key = lambda e:e.attrgetter( 'ordernum'))'を意味しますか?これは何の利益ですか(正直な質問、アイロニーは意図されていません)?決して気にしない、私は今それを手に入れて編集している。あなたは 'ordernum'が既に整数である場合にのみそれを行うことができますが、それは本当にきれいです(そして同時に私のタイプミスを修正しました:) –

関連する問題