【问题标题】:Combining two lists and removing duplicates, without removing duplicates in original list合并两个列表并删除重复项,而不删除原始列表中的重复项
【发布时间】:2010-11-22 02:30:32
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 如果second_list中有三个2怎么办?
  • @balpha:是的,我还没有完全决定如何处理它。这是我曾想过的,但考虑到我对此事的优柔寡断而忽略了:)

标签: python list


【解决方案1】:

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

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

【讨论】:

  • 或者如果你需要排序的话: print first_list + sorted(set(second_list) - set(first_list))
  • 列表(set(first_list)|set(second_list)) #|设置交点见stackoverflow.com/questions/4674013/…
  • @staticd:是的,但这给出了错误的答案。结果中只有一个2,而应该有两个。
  • 哎呀。你说得对。完全错过了第一个列表允许重复。 :P
【解决方案2】:

你可以使用集合:

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))
【解决方案3】:

基于recipe

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

【讨论】:

    【解决方案4】:

    如果您使用 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】:

      对我来说最简单的是:

      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]
      

      【讨论】:

      • 这是一个很好的解决方案,但请记住,如果我们尝试将字典数组设置为一个集合,它将不起作用。 (将提出TypeError: unhashable type: 'dict'
      【解决方案6】:
      first_list = [1, 2, 2, 5]
      second_list = [2, 5, 7, 9]
      
      print( set( first_list + second_list ) )
      

      【讨论】:

        【解决方案7】:

        您还可以将 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),所以这段代码的worst-case复杂度仍然是O(m*n)

        【讨论】:

          【解决方案8】:
              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]

          【讨论】:

            【解决方案9】:

            这可能会有所帮助

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

            【讨论】:

              【解决方案10】:
              resulting_list = list(first_list)
              resulting_list.extend(x for x in second_list if x not in resulting_list)
              

              【讨论】:

              • 终于有了一个不涉及到集合的答案!赞一个。
              • 这实际上是 O(n*m) 但当您有不可散列的事物列表并且性能不是问题时可能会很方便
              • 我不想从第一个或第二个重复什么?
              • 这种技术保留了列表中属性的顺序,set 不是这种情况。 ?
              【解决方案11】:
              resulting_list = first_list + [i for i in second_list if i not in first_list]
              

              【讨论】:

              • 设置 first_list 并且你已经“设置”了
              • 结果列表不会被排序。
              • 如果我也不希望任何列表有重复项怎么办?这样,如果一个列表有重复,它们将返回
              猜你喜欢
              • 2015-11-29
              • 2017-06-05
              • 1970-01-01
              • 1970-01-01
              • 2015-09-20
              • 2020-05-20
              • 2015-01-03
              • 2016-10-24
              相关资源
              最近更新 更多