比较 2 个二维列表并根据另一个列表从一个列表中删除项目

compare 2 2D lists and delete items from one list based on another

我有两个二维列表,如下所示:

list1 = [[26, "k", 5.78],
         [26, "M", 5.89],
         [26, "J", 7.89],
          .........
         [290, "O", 9.9]]

len(list1) = 4978

list2 = [[26, "k", 0.99],
         [26, "M", 0.88],
         [26, "J", 9.77],
           .......
         [290, "O", 7.88]]

len(list2) =4765

我想遍历 list1,如果某行的第一个索引和第二个索引不在 list2 中,我想删除这一行。

本质上是这样的:

for i in list1:
    if i[0]+i[1] not in any rows of list2, delete this row from list1.

例如,如果 list1 有这样一行:

[57, "k", 9.8]

但是在list2中,没有包含57, and "k"的行,那么我需要从list1中删除这一行。

list1 和 list2 中的第三列不参与此比较。 而且,它保证对于 list2 中的每一行,list1 中有另一行包含相应的第一个元素和第二个元素,这意味着,如果 list2 有这样的一行:

[58, "J", 0.9]

那么list1肯定有58, and "J"

开头的行

你可以试试这个:

list1 = [[26, "k", 5.78],
     [26, "M", 5.89],
     [26, "J", 7.89],
     [290, "O", 9.9]]

list2 = [[26, "k", 0.99],
     [26, "M", 0.88],
     [26, "J", 9.77],
     [290, "O", 7.88]]
new_list1 = [[a, b, c] for a, b, c in list1 if any(a == d and b == e for d, e, f in list2)]
list1 = [[26, "k", 5.78],
         [26, "M", 5.89],
         [26, "J", 7.89],
         [26, "K", 7.89],  # will be removed
         [290, "O", 9.9]]

list2 = [[26, "k", 0.99],
         [26, "M", 0.88],
         [26, "J", 9.77],
         [290, "O", 7.88]]

list2_indices = set([(elem[0], elem[1]) for elem in list2])
list1 = [elem for elem in list1 if (elem[0], elem[1]) in list2_indices]
print(list1)

它首先创建一组元素二中的所有第一个和第二个元素。 之后,它创建一个新列表,其中包含 list1 中具有 list2 中索引的所有元素。

如果需要就地删除项目,也可以不创建新列表,而是从列表 1 中删除项目。