关于python:组合两个列表并删除重复项,而不删除原始列表中的重复项

Combining two lists and removing duplicates, without removing duplicates in original list

我需要合并两个列表,其中第二个列表忽略了第一个列表的任何重复项。…有点难以解释,所以让我举一个例子说明代码的外观,以及作为结果我想要什么。

1
2
3
4
5
6
first_list = [1, 2, 2, 5]

second_list = [2, 5, 7, 9]

# The result of combining the two lists should result in this list:
resulting_list = [1, 2, 2, 5, 7, 9]

您会注意到结果有第一个列表,包括它的两个"2"值,但是第二个"u"列表也有一个额外的2和5值这一事实不会添加到第一个列表中。

通常情况下,我会使用集合,但是第一个列表上的集合会清除它已经拥有的重复值。所以我只是想知道什么是实现这种理想组合的最佳/最快的方法。

谢谢。


您需要将第二个列表中不在第一个列表中的元素附加到第一个列表中-集合是确定它们是哪些元素的最简单方法,如下所示:

1
2
3
4
5
6
7
8
9
10
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

in_first = set(first_list)
in_second = set(second_list)

in_second_but_not_in_first = in_second - in_first

result = first_list + list(in_second_but_not_in_first)
print result  # Prints [1, 2, 2, 5, 9, 7]

或者如果你喜欢一个内衬8-)

1
print first_list + list(set(second_list) - set(first_list))


1
2
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)


您可以使用集合:

1
2
3
4
5
6
7
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

resultList= list(set(first_list) | set(second_list))

print(resultList)
# Results in : resultList = [1,2,5,7,9]


1
2
3
4
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

print( set( first_list + second_list ) )


如果使用numpy:

1
2
3
4
5
6
a = [1,2,3,4,5,6,7]
b = [2,4,7,8,9,10,11,12]

sorted(np.unique(a+b))

>>> [1,2,3,4,5,6,7,8,9,10,11,12]


对我来说最简单的是:

1
2
3
4
5
6
7
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

merged_list = list(set(first_list+second_list))
print(merged_list)

#prints [1, 2, 5, 7, 9]


1
resulting_list = first_list + [i for i in second_list if i not in first_list]


根据配方:

resulting_list = list(set().union(first_list, second_list))


这可能有帮助

1
2
3
4
def union(a,b):
    for e in b:
        if e not in a:
            a.append(e)

union函数将第二个列表合并到第一个列表中,如果元素已经在a中,则不复制该元素。类似于set union运算符。此函数不会更改b。如果a=[1,2,3]b=[2,3,4]。联合后(a,b)使a=[1,2,3,4]和b=[2,3,4]


您还可以将richiehindle和ned batchelder对保存顺序的平均case o(m+n)算法的响应结合起来:

1
2
3
4
5
6
7
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

fs = set(first_list)
resulting_list = first_list + [x for x in second_list if x not in fs]

assert(resulting_list == [1, 2, 2, 5, 7, 9])

请注意,x in s的最坏情况复杂度为o(m),因此此代码的最坏情况复杂度仍然是o(m*n)。


1
2
3
4
5
6
7
8
L1 = [1,2,3,3,4,4]
L2 = [3,4,5,6,6,6]
L1.extend(L2)
L3 =[]
[L3.append(num) for num in L1 if num not in L3]
print L3
[1, 2, 3, 4, 5, 6]
[Finished in 0.5s]


1
2
3
4
5
6
7
8
9
10
11
    first_list = [1, 2, 2, 5]
    second_list = [2, 5, 7, 9]

    newList=[]
    for i in first_list:
        newList.append(i)
    for z in second_list:
        if z not in newList:
            newList.append(z)
    newList.sort()
    print newList

[1、2、2、5、7、9]