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

时间:2009-08-23 19:27:59

标签: python list

我有两个列表需要合并,其中第二个列表忽略了第一个列表的任何重复项。 ..有点难以解释,所以让我展示代码的样子,以及我想要的结果。

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上的一个集合将清除它已有的重复值。所以我只是想知道实现这种理想组合的最佳/最快方式是什么。

感谢。

14 个答案:

答案 0 :(得分:129)

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

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

答案 1 :(得分:45)

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

答案 2 :(得分:16)

您可以使用套装:

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]

答案 3 :(得分:6)

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

print( set( first_list + second_list ) )

答案 4 :(得分:5)

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

答案 5 :(得分:4)

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

答案 6 :(得分:4)

对我来说最简单的是:

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]

答案 7 :(得分:2)

这可能会有所帮助

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

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

答案 8 :(得分:2)

基于recipe

  

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

答案 9 :(得分:1)

您还可以将RichieHindle和Ned Batchelder的回复组合成一个保留顺序的 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 has a worst-case complexity of O(m),因此此代码的最坏情况复杂性仍然是 O(m * n)

答案 10 :(得分:0)

    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]

答案 11 :(得分:0)

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]

答案 12 :(得分:0)

就像belove一样:

resulting_list = list(set(resulting_list))

答案 13 :(得分:0)

list1 = [1, 2, 1]
list2 = [2, 3, 4, 3]

def extendList(list1, list2):
   return list(set(list1+list2))

list12 = extendList(list1, list2)
print(list12)

输出:[1、2、3、4]