2013-06-03 12 views
7

私は同じクラスのインスタンスのリストを持っています。クラス内のプロパティに基づいてリストを区別したいと思っています。これを達成する最も無邪気な方法は何ですか?ここでリスト内のクラスのプロパティに基づいて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検索を試してみましたが、私が見つけたすべての結果が数値のみではなくカスタムオブジェクトが含まれて単純なリストを扱って...

答えて

6

プロパティを仮定すると、

d = {} 
for x in xs: 
    d[x.tag] = x 

今すぐdが単一xtag値ごとが含まれています。:不変である上のキーしたい、あなたは辞書を使用することができますd.values()またはd.itervalues()を使用してxsにアクセスすることができます。

NB。ここで最後に一致するアイテムが勝ちます。最初のものが勝つようにするには、逆に反復する。

+0

あなたはまた、フィルタ()(http://docs.python.org/2/library/functionsを使用したら。 html#filter)を使用します。これは、インラインfor-loopのために少し速いはずです。 – pypat

+0

ありがとうございます。これ(辞書の使用)は機能しますが、それを達成する「最良の」方法ですか? pypatによって提案された解決策は、よりpythonのようです。 – v3gard

+1

@pypat:以前は見えなかった値をdictに加えるか、実際には単に 's = set()'とすると、 'filter(lambda x:s elseのx.tagならFalse (s.add(x.tag)またはTrue)、myList) '。提案していただきありがとうございます! 'for'-and-dictベースのバージョンは私にとってはもっとシンプルだと感じましたので、私は切り替え前にベンチマークを行いました。 –

9

あなたは例えばpython dict comprehension

{x.tag: x for x in myList}.values() 

を使用することができます。

>>> class MyClass(object): 
...  def __init__(self, classId, tag): 
...   self.classId = classId 
...   self.tag = tag 
... 
>>> myList = [MyClass(1, "ABC"), MyClass(2, "DEF"), MyClass(3, "DEF")] 
>>> uniqList = {x.tag: x for x in myList}.values() 
>>> print [x.classId for x in uniqList] 
[1, 3] 
関連する問題