私はいくつかの名前付き属性を持つPython 3.5.1のオブジェクトのリストを持っています。リストはC変数のグループを表し、各オブジェクトには3つの共通の基本タイプ(uint8、uint16、およびuint32)に対応する3つの名前付き属性があります。python3複数の名前付き属性によるオブジェクトの並べ替え
class variableList(object):
def __init__(self, eight, sixteen, thirtytwo):
self.size_8 = eight
self.size_16 = sixteen
self.size_32 = thirtytwo
これらの名前付き属性の値が(Nonetype) None
か(str)'E'
のいずれかです。オブジェクトごとに、指定された属性のうちの1つだけが非None値を持ちます。
このオブジェクトのリストをソートして、size_32以外の値でないすべてのオブジェクトが上にあり、その後にsize_16が続き、size_8が続くようにしたいとします。 python 2.7.1では
は私が成功し、これを使用しますが、それは黒魔術のように感じていない:
size_filtered_list = sorted(filtered_list, key=lambda y: (y.size_32, y.size_16, y.size_8))
が、3.5.1で、これはもはや機能します。提案?
'__lt__'メソッドと' __eq__'メソッドを定義すると、 'key'引数なしで変数をソートすることができます。私はCに慣れていないので、基本的に ''(str) ''がPythonで何を意味するのかを説明できますか? –
'False'と' True'を使うのではなく、効果的なブール値フラグを 'None'と' 'E''として使用している理由はありますか?互換性のない型を使用していなかった場合、ソートは 'sorted(filtered_list、key = attrgetter( 'size_32'、 'size_16')を使って、ファイルの先頭にある' from operator import attrgetter' 、 'size_8')) '、これはPythonのすべてのバージョンでうまく動作します。 – ShadowRanger
また、 'self.size_8_exist'のように別の変数を追加しても、同じテクニックを使えます。 – arewm