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

我有两个列表,我需要组合,其中第二个列表有任何重复的第一个列表忽略。..有点难以解释,所以让我来演示一个代码的示例,以及我希望得到的结果。

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值,这个事实并没有添加到第一个列表中。

通常对于这种情况,我会使用 set,但 first _ list 上的 set 会清除它已经有的重复值。所以我只是想知道如何最快最好地实现这个组合。

谢谢。

273533 次浏览

你需要在第一个列表中添加第二个列表中不在第一个集合中的元素,这是确定它们是哪些元素的最简单的方法,比如:

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)))
resulting_list = first_list + [i for i in second_list if i not in first_list]
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)

这个可能会有帮助

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]

您可以使用 set:

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

你也可以将 RichieHindle 和 Ned Batchelder 的回答结合起来,得到一个保持秩序的 < a href = “ https://stackoverflow. com/a/3906036/320036”> average-case 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的最坏情况复杂度为 < em > O (m) ,所以这段代码的 最坏的情况复杂度仍然是 O (m * n)

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


print( set( first_list + second_list ) )

对我来说最简单的就是:

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]

如果使用 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]

基于 食谱:

Result _ list = list (set () . union (first _ list,second _ list))

您可以使用 dict.fromkeys返回一个没有重复的列表:

def mergeTwoListNoDuplicates(list1, list2):
"""
Merges two lists together without duplicates
:param list1:
:param list2:
:return:
"""
merged_list = list1 + list2
merged_list = list(dict.fromkeys(merged_list))
return merged_list