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

时间:2017-12-21 21:50:00

标签: python list 2d delete-row

我有两个2D列表,如下所示:

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"

开头

2 个答案:

答案 0 :(得分:3)

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)

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

除了创建新列表外,还可以从list1中删除项目,如果它需要就地。

答案 1 :(得分:2)

你可以试试这个:

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)]