我想合并两个列表并删除重复值。
假设我有两个列表:
lst1 = [23,15,46,76,45]
lst2 = [43,32,15,49,45,10]
我要输出:
result = [23,15,46,76,45,43,32,49,10]
结果中,必须保持元素的列表顺序。例如,在第二个列表中,位置 0 处的元素 43,然后是 32,然后是 49,然后是 10,依此类推...
您可以使用
set
:
In [1]: set(lst1).union(set(lst2))
Out[1]: {10, 15, 23, 32, 43, 45, 46, 49, 76}
如果订单很重要,您可以使用这个:
resulting_list = lst1
resulting_list.extend(x for x in lst2 if x not in resulting_list)
输出:
[23,15,46,76,45,43,32,49,10]
只需从第二个列表中添加第一个列表中尚未存在的元素即可:
for element in list_2:
if element not in list_1:
list_1.append(element)
result = lst1 + [element for element in lst2 if element not in lst1]
如果你不需要列表的顺序,也许你可以尝试:
set(lst1).union(set(lst2))
你还可以获得一套
{32, 10, 43, 76, 45, 46, 15, 49, 23}
。
如果你想保持列表的顺序,你可以试试这个:
print(lst1+[i for i in lst2 if i not in lst1])
输出:
[23, 15, 46, 76, 45, 43, 32, 49, 10]
如果
lst1
和lst2
中可能存在重复元素,例如:
lst1 = [1,2,1,3]
lst2 = [2,4,5,4]
如果你仍然想保持这两个列表的顺序,你可以删除重复的元素,然后将它们组合起来:
ts = set()
rm_duplicate=lambda l:[x for x in l if not (x in ts or ts.add(x))]
print(rm_duplicate(lst1)+[i for i in rm_duplicate(lst2) if i not in lst1])
结果:
[1, 2, 3, 4, 5]
如果您的列表元素是可散列的:
st1 = set(lst1)
result = lst1 + [i for i in lst2 if not i in st1]
在您的玩具示例中,您不会感觉到差异,但如果列表适度大,则转换为 set 将加快元素查找速度。
你可以这样使用set,
lst1 = [23,15,46,76,45]
lst2 = [43,32,15,49,45,10]
print list(set(lst1 + lst2))
我知道这是一个老问题,但没有人提到使用 dict,它将删除重复项,并且从 Python 3.6 开始,保留顺序。
这里有两种方法:
lst1 = [23,15,46,76,45]
lst2 = [43,32,15,49,45,10]
print( list({x:0 for x in lst1+lst2}.keys()) )
print( list(dict.fromkeys(lst1+lst2,0).keys()) )
输出:
[23, 15, 46, 76, 45, 43, 32, 49, 10]
[23, 15, 46, 76, 45, 43, 32, 49, 10]