有没有更好的方法来擦除嵌套列表中不常见的元素
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]
有没有更好的制作方法? (比如更快,或更短)
一个可能的解决方案是,您可以创建一个包含 l1
和 l2
元素交集的临时集,然后根据此集过滤 l1
和 l2
:
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']]
您还可以创建中间词典 d1
和 d2
,然后 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]
我试着比较两个像这样的嵌套列表:
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]
有没有更好的制作方法? (比如更快,或更短)
一个可能的解决方案是,您可以创建一个包含 l1
和 l2
元素交集的临时集,然后根据此集过滤 l1
和 l2
:
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']]
您还可以创建中间词典 d1
和 d2
,然后 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]