我想从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
我尝试了一些使用集合和/或元组的示例技术,但它们都基于从一个列表列表中删除重复项;而不是基于单独的列表列表中的一个字段删除列表列表的项目。
答案 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]]