我有两个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"
开头
你可以试试这个:
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)
它首先在元素2中创建一组所有第一和第二元素。之后,它创建一个新列表,其中list1的所有元素都具有list2中的索引。
如果需要就地,也可以从list1中删除项目,而不是创建新列表。