【问题标题】:Subtract 2 lists by duplicate elements in python通过python中的重复元素减去2个列表
【发布时间】:2018-01-13 17:30:18
【问题描述】:

您好,我想知道如何在 python 中通过重复元素而不是值减去 2 个列表。

ListA = [G, A, H, I, J, B]

ListB = [A, B, C]

ListC = [G, H, I, J] 

所以我们减去 ListB 的值,如果在 ListA 中发现它们是重复的,那么 ListC 将返回 ListA 中的非重复值。

  • 数学上写成这样:

    ListC = ListA - (ListA ∩ ListB)

(我不想去掉ListA中的重复,只去掉ListA和ListB的交集,如上式所述,所以本题不重复questions/48242432

【问题讨论】:

标签: python python-3.x list duplicates elements


【解决方案1】:

你可以做一个列表理解..

[x for x in listA if x not in listB]

【讨论】:

  • 最好使用set(listB) 进行~O(1) 检查。
【解决方案2】:

试试这个

>>> def li(li1,li2):
    li3=li1
    for i in li2:
        if i in li1:
            li3.remove(i)
    return(li3)

>>> li(["G","A","H","I","J","B"],["A","B","C"])
['G', 'H', 'I', 'J']

【讨论】:

    【解决方案3】:

    在 Python 中使用集合库。

    from sets import Set
    
    setA = Set(['G', 'A', 'H', 'I', 'J', 'B'])
    setB = Set(['A', 'B', 'C'])
    
    # get difference between setA and intersection of setA and setB
    setC = setA - (setA & setB)
    

    集合很酷的一点是它们往往比列表推导式运行得更快。例如,此操作倾向于在O(len(setA)) + O(min(len(setA), len(setB))) = O(len(setA)) 运行,而列表推导将在O(len(setA) * len(setB)) 运行以达到相同的结果。当然,这些只是一般情况,而不是最坏情况。最坏的情况,他们会是一样的。无论哪种方式,您都应该使用最适合您的操作的对象,对吧?

    请参阅the Python documentation 了解更多信息。

    【讨论】:

    • 正如您链接的文档一开始就警告的那样,sets 模块自 Python 2.6 以来已被弃用,Python 2.6 已于近十年前(2008 年 10 月 1 日)发布,甚至不存在于现代蟒蛇。
    • @DSM 很好地了解文档。改用这个:docs.python.org/3/tutorial/datastructures.html#sets
    • 我不希望listA中的重复项只删除listA和listB之间的交集,所以我们不能使用set()函数。
    • @Markus84612 我不确定我是否理解你的意思。如果您想要集合 A 和 B 之间的交集,只需执行 setA & setB。如果要保持 set A 的原始状态,只需复制操作前的列表即可
    【解决方案4】:

    这就是你想要的?

    L1 = ['A', 'G', 'H', 'I', 'J', 'B']
    L2 = ['A', 'B', 'C']
    
    for i in L1:
        if i not in L2:
            print(i)
    

    【讨论】:

      【解决方案5】:

      在使用数学集合符号的基础上,为什么不使用集合?

      ListA = [G,A,H,I,J,B]
      
      ListB = [A,B,C]
      
      SetC = set(ListA) - set(ListB)
      

      但随后你开始出发并不得不返回列表...而且顺序可能会发生变化,并且列表中出现两次的任何字符都只会出现一次

      https://docs.python.org/3/tutorial/datastructures.html#sets

      >>> a = set('abracadabra') # sets have only unique elements and are unordered
      >>> b = set('alacazam')
      
      >>> a                                  # unique letters in a
      {'a', 'r', 'b', 'c', 'd'}
      
      >>> a - b                              # letters in a but not in b
      {'r', 'd', 'b'}
      
      >>> a | b                              # letters in a or b or both
      {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
      
      >>> a & b                              # letters in both a and b
      {'a', 'c'}
      
      >>> a ^ b                              # letters in a or b but not both
      {'r', 'd', 'b', 'm', 'z', 'l'}
      

      【讨论】:

      • set() 也删除了 listA 中的重复元素。我不希望这样,我只想删除 2 个列表的交集。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      相关资源
      最近更新 更多