python匹配2列表和删除匹配

时间:2017-01-05 17:04:05

标签: python algorithm list

我想从list2中删除列表中与list1中第三项匹配的任何列表项。我目前正在尝试遍历list2中list1中的每个项目,并根据第三个字段删除。

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

我尝试了一些使用集合和/或元组的示例技术,但它们都基于从一个列表列表中删除重复项;而不是基于单独的列表列表中的一个字段删除列表列表的项目。

3 个答案:

答案 0 :(得分:0)

我建议制作一个新列表。您还可以创建list1中可以检查的所有第三项的中间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]]

或作为列表comp

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

答案 1 :(得分: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 ]

如果您不想要新列表,但确实想从list2中删除,那么:

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

答案 2 :(得分: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]]