2017-01-05 7 views
0

list1の3番目のアイテムと一致するリストのリストアイテムをリスト2から削除したいと思います。私は現在、list1の各項目に対してlist2をループし、3番目の項目に基づいて削除しようとしています。2リストのリストとマッチを取り除く

list1: [[1,2,3],[4,5,6],[7,8,9]] 

list2: [[-1,-2,3],[-4,-5,-6],[-7,-8,9],[1,2,8]] 

final list2: [[-4,-5,-6],[1,2,8]] 

私の擬似コード:

for item1 in list1: 
    for item2 in list2: 
     if item1[2] == item2[2]: 
      remove item2[2] from list2 

を私はいくつかのサンプルセットを使用した技術および/またはタプルを試してみましたが、それらはすべてのリストの1つのリストから重複を削除するに基づいています。リストの別のリストの1つのフィールドに基づいてリストのリストの項目を削除するのとは対照的である。

+2

ではなく、新しいリストを作成するのはなぜですか? 'new_list = [list1にない項目の場合はlist2の項目の項目]'望むなら 'list2'に代入することもできます。 – sytech

+0

** 'list2からlist1の3番目の項目と一致するリスト項目を削除する' ** –

+0

@sytechこれを実行しようとしましたか? – roganjosh

答えて

0

私は新しいリストを作成することをお勧めします。また、すべての反復ですべての要素を調査するのではなく、確認できるリスト1のすべての3番目の項目の仲介をthird_itemsに設定することもできます。

list1 = [[1,2,3],[4,5,6],[7,8,9]] 
list2 = [[-1,-2,3],[-4,-5,-6],[-7,-8,9],[1,2,8]] 

third_items = set(sublist[2] for sublist in list1) 
new_list = [] 
for sublist in list2: 
    if sublist[2] not in third_items: 
     new_list.append(sublist) 
print(new_list) 

出力:

[[-4, -5, -6], [1, 2, 8]] 

またはリストカンプ

third_items = set(sublist[2] for sublist in list1) 
new_list = [sublist for sublist in list2 if sublist[2] not in third_items] 
+0

完全に作業しました。 list1は170のリストエントリであり、list2は68,478のリストエントリだったので、少し時間がかかりました。 – user3552459

0

としてあなたはリスト内包を持つ単一の行でこれを行うことができます。

result = [ (a) for a in list2 if a[2] not in [ (b[2]) for b in list1 ] ] 

これではありません必然的に最も効率的なやり方それはおそらく最も簡潔です。大きなリストを扱っていた場合、最初にルックアップを抽出することができます。以下のように:

lookup = [ (b[2]) for b in list1 ] 
result = [ (a) for a in list2 if a[2] not in lookup ] 

新しいリストをしたいが、実際にはその後、リスト2から削除したくない場合:あなただけの両方に対応する要素を比較したい場合は、以下が動作する

lookup = [ (b[2]) for b in list1 ] 
[ list2.remove(a) for a in list2 if a[2] in lookup ] 
0

リスト:

list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
list2 = [[-1, -2, 3], [-4, -5, -6], [-7, -8, 9], [1, 2, 8]] 

list3 = [] 

for index, item in enumerate(list2): 
    if index < len(list1): 
     if item[2] != list1[index][2]: 
      list3.append(item) 
    else: 
     list3.append(item) 

両方のリストは、同じ長さを持っている場合、これが行います。

list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3]] 
list2 = [[-1, -2, 3], [-4, -5, -6], [-7, -8, 9], [1, 2, 8]] 

if len(list1) == len(list2): 
    list3 = [x for i, x in enumerate(list2) if x[2] != list1[i][2]] 
関連する問題