组合两个列表并删除重复项,而不更改列表的元素顺序

时间:2017-04-10 13:45:35

标签: python list set

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

假设我有两个列表,如

IN

我想输出如下:

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

在结果列表中,必须遵循元素顺序,如第二个列表元素43中的0位置,之后32个进入结果列表,之后49个来到,之后10个来到等等...

7 个答案:

答案 0 :(得分:1)

您可以使用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]

答案 1 :(得分:0)

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

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]

如果lst1lst2中可能存在重复的元素,例如:

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]

答案 2 :(得分:0)

只需添加第一个列表中已有的元素,即第二个:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Python有一个内置的set type来执行此类操作:

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

答案 5 :(得分:0)

如果您的列表元素是可清除的:

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

在您的玩具示例中,您不会感觉到差异,但如果列表中等大小,转换为设置将加快元素查找。

答案 6 :(得分:0)

你可以使用像这样的设置,

{{1}}