如何组合两个列表,删除重复项,而不改变列表的元素顺序?

问题描述 投票:0回答:8

我想合并两个列表并删除重复值。

假设我有两个列表:

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,依此类推...

python list
8个回答
3
投票

您可以使用

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]


2
投票

只需从第二个列表中添加第一个列表中尚未存在的元素即可:

for element in list_2:
    if element not in list_1:
        list_1.append(element)

1
投票
result = lst1 + [element for element in lst2 if element not in lst1]

1
投票

如果你不需要列表的顺序,也许你可以尝试:

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]

0
投票

如果您的列表元素是可散列的:

st1 = set(lst1)
result = lst1 + [i for i in lst2 if not i in st1]

在您的玩具示例中,您不会感觉到差异,但如果列表适度大,则转换为 set 将加快元素查找速度。


0
投票

你可以这样使用set,

lst1 = [23,15,46,76,45]
lst2 = [43,32,15,49,45,10]

print list(set(lst1 + lst2))

0
投票

我知道这是一个老问题,但没有人提到使用 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]

-1
投票

Python 有一个内置的

set
type 可以执行此类操作:

set(lst1).union(set(lst2))

© www.soinside.com 2019 - 2024. All rights reserved.