有没有更好的方法来擦除嵌套列表中不常见的元素

Is there better way to erase elements not in common in nested lists

我试着比较两个像这样的嵌套列表:
l1 = [[1,'a'],[2,'a'],[3,'a'],[5,'a']]
l2 = [[1,'b'],[2,'b'],[4,'b'],[5,'b']].
我需要得到这样的列表:
l1 = [[1, 'a'], [2, 'a'], [5, 'a']],
l2 = [[1, 'b'], [2, 'b'], [5, 'b']].
我可以这样实现它:

def validation_in_list(lst1,lst2,idx=0):
    lst1_val = lst1[:]
    lst2_val = lst2[:]
    lst1_idx = []
    lst2_idx = []
    for element in lst1:
        lst1_idx += [element[idx]]
    for element in lst2:
        lst2_idx += [element[idx]]
    set1 = set(lst1_idx)
    set2 = set(lst2_idx)
    del1 = set1.difference(set2)
    del2 = set2.difference(set1)
    for i in range(len(lst1)):
        if lst1[i][idx] in del1:
            lst1_val.remove(lst1[i])
    for i in range(len(lst2)):
        if lst2[i][idx] in del2:
            lst2_val.remove(lst2[i])
    return [lst1_val,lst2_val]

有没有更好的制作方法? (比如更快,或更短)

一个可能的解决方案是,您可以创建一个包含 l1l2 元素交集的临时集,然后根据此集过滤 l1l2

l1 = [[1, "a"], [2, "a"], [3, "a"], [5, "a"]]
l2 = [[1, "b"], [2, "b"], [4, "b"], [5, "b"]]

tmp = set(v for v, _ in l1).intersection(v for v, _ in l2)

l1 = [subl for subl in l1 if subl[0] in tmp]
l2 = [subl for subl in l2 if subl[0] in tmp]

print(l1)
print(l2)

打印:

[[1, 'a'], [2, 'a'], [5, 'a']]
[[1, 'b'], [2, 'b'], [5, 'b']]

您还可以创建中间词典 d1d2,然后 re-create 从那里创建列表:

d1 = {k: v for k, v in l1}
d2 = {k: v for k, v in l2}

l1 = [[k, v] for k, v in d1.items() if k in d2]
l2 = [[k, v] for k, v in d2.items() if k in d1]