合并两个列表并删除重复项,而不删除原始列表中的重复项


115

我需要合并两个列表,其中第二个列表将忽略第一个列表的任何重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。

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”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。

通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实现此所需组合的最佳/最快方法。

谢谢。


3
如果有三个2 second_list怎么办?
balpha

@balpha:是的,我还没有完全确定我要如何处理。这是我曾考虑过的事情,但由于我对此事犹豫不决,所以
不予考虑

Answers:


168

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

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-)

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

2
或者,如果您需要对它进行排序:print first_list + sorted(set(second_list)-set(first_list))
hughdbrown

1
List(set(first_list)| set(second_list))#| 是交集见stackoverflow.com/questions/4674013/...
staticd

1
@staticd:是的,但这给出了错误的答案。2当应该有两个结果时,结果只有一个。
RichieHindle 2013年

哎呀 你是对的。完全错过第一个列表允许重复。:P
2013年


29

您可以使用集:

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]

是的,谢谢。这样就可以了。resultList = first_list + list(set(second_list)-set(first_list))
Kathiravan Umaidurai

9

如果使用numpy,则可以将其简化为一行代码:

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]

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

print( set( first_list + second_list ) )


5

对我来说最简单的是:

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
这是一个很好的解决方案,但请记住,如果我们尝试将一组词典设置为一组,例如(will TypeError: unhashable type: 'dict'
take

2

您还可以结合RichieHindle和Ned Batchelder的响应,得到保留顺序的平均情况 O(m + n)算法:

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)


0

这可能有帮助

def union(a,b):
    for e in b:
        if e not in a:
            a.append(e)

union函数将第二个列表合并为第一个列表,而不复制a的元素(如果已经存在于a中)。与设置联合运算符相似。此功能不变b。如果a = [1,2,3] b = [2,3,4]。在union(a,b)使a = [1,2,3,4]和b = [2,3,4]之后


0

根据配方

result_list = list(set()。union(first_list,second_list))


-2
    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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.