私は同じクラスのインスタンスのリストを持っています。クラス内のプロパティに基づいてリストを区別したいと思っています。これを達成する最も無邪気な方法は何ですか?ここでリスト内のクラスのプロパティに基づいてPythonのリストを作る方法は?
は、いくつかのサンプルコードです:
#!/usr/bin/python
#-*- coding:utf-8 -*-
class MyClass(object):
def __init__(self, classId, tag):
self.classId = classId
self.tag = tag
myList = []
myInstance1 = MyClass(1, "ABC")
myInstance2 = MyClass(2, "DEF")
myInstance3 = MyClass(3, "DEF")
myList.append(myInstance1)
myList.append(myInstance3) # note that the order is changed deliberately
myList.append(myInstance2)
私は今のMyClassのプロパティのいずれかに基づいて私のリストをソートしたい場合は、私は通常ちょうどキーでそれを並べ替え、およびラムダ式を使用してキーを設定します - このような:
myList.sort(key=lambda x: x.classId)
for x in myList:
print x.classId
$ python ./test.py
1
2
3
それは「タグ」プロパティに基づいてリストを明瞭にするために同様の方法(ラムダ、マップまたは類似)を使用することは可能ですか?また、これが可能であれば、そのリストのクラスのプロパティに基づいてリストを区別する最も「ピジョンソニック」な方法ですか?
あなたは、私はすでにこの問題に関するトピックを両方SOとGoogle検索を試してみましたが、私が見つけたすべての結果が数値のみではなくカスタムオブジェクトが含まれて単純なリストを扱って...
あなたはまた、フィルタ()(http://docs.python.org/2/library/functionsを使用したら。 html#filter)を使用します。これは、インラインfor-loopのために少し速いはずです。 – pypat
ありがとうございます。これ(辞書の使用)は機能しますが、それを達成する「最良の」方法ですか? pypatによって提案された解決策は、よりpythonのようです。 – v3gard
@pypat:以前は見えなかった値をdictに加えるか、実際には単に 's = set()'とすると、 'filter(lambda x:s elseのx.tagならFalse (s.add(x.tag)またはTrue)、myList) '。提案していただきありがとうございます! 'for'-and-dictベースのバージョンは私にとってはもっとシンプルだと感じましたので、私は切り替え前にベンチマークを行いました。 –