从两个二维列表中删除重复项
removing duplicates from two 2 dimensional list
我在 python 中搜索了从两个 2d 列表中删除重复项的解决方案我找不到所以这里是我的问题:
我有两个列表,例如
[[1,2],[3,5],[4,4],[5,7]]
[[1,3],[4,4],[3,5],[3,5],[5,6]]
预期结果:
[[1,2],[1,3],[5,7],[5,6]]
我想删除与另一个列表的值完全匹配的列表中的列表。
我的脚本:
def filter2dim(firstarray, secondarray):
unique = []
for i in range(len(firstarray)):
temp=firstarray[i]
for j in range(len(secondarray)):
if(temp == secondarray[j]):
break
elif(j==(len(secondarray)-1)):
unique.append(temp)
for i in range(len(secondarray)):
temp=secondarray[i]
for j in range(len(firstarray)):
if(temp == firstarray[j]):
break
elif(j==(len(firstarray)-1)):
unique.append(secondarray[i])
return
如果你修复它并解释你做了什么,那就太好了。
谢谢,最诚挚的问候
用元组替换你的 2 项列表,你可以使用集合操作(因为元组是不可变的而列表不是,集合项必须是不可变的):
a = {(1,2),(3,5),(4,4),(5,7)}
b = {(1,3),(4,4),(3,5),(3,5),(5,6)}
print(a.symmetric_difference(b)) # {(1, 2), (5, 7), (5, 6), (1, 3)}
请注意,这也会删除每个列表中的重复项,因为它们是集合,并且顺序会被忽略。
如果您需要以编程方式将列表转换为元组,列表理解就可以正常工作:
list_a = [[1,2],[3,5],[4,4],[5,7]]
set_a = {(i, j) for i, j in list_a}
print(set_a) # {(1, 2), (4, 4), (5, 7), (3, 5)}
你的脚本对我来说工作正常,只需添加:return unique
把第一个列表变成dict
:
a = [[1, 2], [3, 5], [4, 4], [5, 7]]
b = [[1, 3], [4, 4], [3, 5], [3, 5], [5, 6]]
filt = dict(a)
result = [el for el in b if el[0] in filt and el[0] == filt[el[0]]]
或者,将第一个列表变成一组元组,然后只检查成员资格:
filt = set(map(tuple, a))
result = [el for el in b if tuple(el) in filt]
这两种解决方案都避免多次迭代第一个列表,因为 dict
和 set
查找是 O(1)。
我在 python 中搜索了从两个 2d 列表中删除重复项的解决方案我找不到所以这里是我的问题:
我有两个列表,例如
[[1,2],[3,5],[4,4],[5,7]]
[[1,3],[4,4],[3,5],[3,5],[5,6]]
预期结果:
[[1,2],[1,3],[5,7],[5,6]]
我想删除与另一个列表的值完全匹配的列表中的列表。
我的脚本:
def filter2dim(firstarray, secondarray):
unique = []
for i in range(len(firstarray)):
temp=firstarray[i]
for j in range(len(secondarray)):
if(temp == secondarray[j]):
break
elif(j==(len(secondarray)-1)):
unique.append(temp)
for i in range(len(secondarray)):
temp=secondarray[i]
for j in range(len(firstarray)):
if(temp == firstarray[j]):
break
elif(j==(len(firstarray)-1)):
unique.append(secondarray[i])
return
如果你修复它并解释你做了什么,那就太好了。 谢谢,最诚挚的问候
用元组替换你的 2 项列表,你可以使用集合操作(因为元组是不可变的而列表不是,集合项必须是不可变的):
a = {(1,2),(3,5),(4,4),(5,7)}
b = {(1,3),(4,4),(3,5),(3,5),(5,6)}
print(a.symmetric_difference(b)) # {(1, 2), (5, 7), (5, 6), (1, 3)}
请注意,这也会删除每个列表中的重复项,因为它们是集合,并且顺序会被忽略。
如果您需要以编程方式将列表转换为元组,列表理解就可以正常工作:
list_a = [[1,2],[3,5],[4,4],[5,7]]
set_a = {(i, j) for i, j in list_a}
print(set_a) # {(1, 2), (4, 4), (5, 7), (3, 5)}
你的脚本对我来说工作正常,只需添加:return unique
把第一个列表变成dict
:
a = [[1, 2], [3, 5], [4, 4], [5, 7]]
b = [[1, 3], [4, 4], [3, 5], [3, 5], [5, 6]]
filt = dict(a)
result = [el for el in b if el[0] in filt and el[0] == filt[el[0]]]
或者,将第一个列表变成一组元组,然后只检查成员资格:
filt = set(map(tuple, a))
result = [el for el in b if tuple(el) in filt]
这两种解决方案都避免多次迭代第一个列表,因为 dict
和 set
查找是 O(1)。