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

Lee*_*var 86 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]
Run Code Online (Sandbox Code Playgroud)

您会注意到结果具有第一个列表,包括其两个"2"值,但second_list还具有额外的2和5值的事实未添加到第一个列表中.

通常对于这样的事情,我会使用集合,但first_list上的一个集合将清除它已有的重复值.所以我只想知道实现这种理想组合的最佳/最快方法.

谢谢.

Ric*_*dle 145

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

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]
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢单行8-)

print first_list + list(set(second_list) - set(first_list))
Run Code Online (Sandbox Code Playgroud)

  • 列表(设置(first_list)|设置(second_list))#| 设置交集见http://stackoverflow.com/questions/4674013/how-to-take-two-lists-and-combine-them-exclusive-any-duplicates (3认同)
  • 或者这个如果你需要它排序:print first_list + sorted(set(second_list) - set(first_list)) (2认同)

Ned*_*der 49

resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)
Run Code Online (Sandbox Code Playgroud)

  • 该技术保留了列表中属性的顺序,而“set”则不然。 (7认同)
  • 最后一个不涉及投入集合的答案!荣誉. (6认同)
  • 也是O(m*n)算法. (3认同)
  • 这实际上是O(n*m)但是如果你有不可拆卸的东西列表并且性能不是一个问题可能会很方便 (2认同)
  • 我不希望从第一个或第二个中复制任何内容? (2认同)

小智 19

你可以使用套装:

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]
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的结果.再次阅读问题. (3认同)

小智 9

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

print( set( first_list + second_list ) )
Run Code Online (Sandbox Code Playgroud)


Raf*_*fiq 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]
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 6

resulting_list = first_list + [i for i in second_list if i not in first_list]
Run Code Online (Sandbox Code Playgroud)


mos*_*gui 6

如果使用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]
Run Code Online (Sandbox Code Playgroud)