比较 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 中删除项目。
我有两个二维列表,如下所示:
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 中删除项目。