2016-05-12 3 views
0

私は2つのオブジェクトのリストをpython2に持っています。それらは異なるタイプのものですが、共通のプロパティ( 'name')を持っています。私は1つのリスト(my_list)を制御し、もう1つは私に送られる(src_list)。リスト内のオブジェクトを他のリストにはないプロパティで比較する方法。 Python2で

のオブジェクトをsrc_listに追加したいのですが、その名前はmy_listにありません。その名前は 'name'プロパティと比較されます。

擬似コード(と私はこれをC言語でやっています)は以下の通りですが、私はPythonのやり方に従っています。おそらくリストと補完関係ですが、理解できませんでした。

new_list = [] 
for srco in src_list: # iterate everything in src list 
    found = False 
    for myo in my_list: # iterate everything in my list 
     if(srco.name.lower() == myo.name.lower()): # compare names, break if true 
      found = True 
      break 
    if not found: # add to new list if wasn't found 
     new_list.append(srco) 

答えて

1

高速検索にはセットを使用します。あなたはより多くのニシキヘビであることを知りたい場合

my_list_names = {obj.name.lower() for obj in my_list} 
new_list = [obj for obj in src_list if obj.name.lower() not in my_list_names] 

また、foundパターンをしません。あなたは

exclude = {x.name.lower() for x in my_list} 
new_list = [x for x in src_list if x.name.lower() not in exclude] 
1

簡単な方法は、最初my_listから除外して、セットから見つけることができないアイテムを保ちsrc_listを反復するために名前のセットを生成することです。これを行いますそれを行うためにセットを使用してください。 (溶液を

diff_set = src_list_set - my_list_set 

そして、あなたはその後、名前diff_set

my_list_set = {obj.name.lower() for obj in my_list} 
src_list_set = {obj.name.lower() for obj in src_list} 
diff_set = src_list_set - my_list_set 
new_list = [obj for obj in src_list if obj.name.lower() in diff_set] 

に表示されるオブジェクトをフェッチ行くことができます: src_listを、別のセットをmy_listという名を含む含むとセットを作成し、単純に2をsubstract特別に短いものではないかもしれませんが、他の操作でマイナスを置き換えることによって、on the official docを最小限のコストで他の多くの状況に適合させることができます)

1

できます

for myo in my_list: 
    if(srco.name.lower() == myo.name.lower()): 
     break 
else: # executes if there was no break 
    new_list.append(srco) 
1

はい、リストの理解は、 yは言った。次に、組み込みのmapを使用して、リストの1つから名前のイテレータを作成できます。

result = [obj for obj in srco if obj.name.lower() not in set(map(lambda x: x.name.lower(), myo))] 
関連する問題