Python中通过重复元素减去2个列表

3

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

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

ListB = [A, B, C]

ListC = [G, H, I, J] 

因此,如果在ListA中找到了与ListB重复的值,则从ListB中减去这些值,ListC将返回ListA中非重复的值。

  • 数学上写成:

    ListC = ListA - (ListA ∩ ListB)

(我不想删除ListA中的重复项,只想删除ListA和ListB之间的交集,如上述公式所示,因此这个问题不是questions/48242432的重复。)


2
可能是Python列表减法操作的重复问题。 - Advay Umare
6个回答

3
你可以使用列表推导式来实现...
[x for x in listA if x not in listB]

最好使用 set(listB) 进行 ~O(1) 的检查。 - Reut Sharabani

1

试试这个

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

1
使用Python中的sets库。
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)) 来实现相同的结果。当然,这些是平均情况,不是最坏情况。最坏情况下,它们将是相同的。无论如何,您应该使用最适合您操作的对象,对吧?
请参见Python文档了解更多信息。

正如您链接的文档在开头警告的那样,自从 Python 2.6 发布(2008年10月1日)以来已经过去了将近十年的时间,sets 模块已被弃用,并且在现代 Python 中甚至不存在。 - DSM
@DSM 文档方面注意得很好。请使用此链接代替:https://docs.python.org/3/tutorial/datastructures.html#sets - Woody1193
我不想删除listA中的重复项,只想删除listA和listB之间的交集,因此我们不能使用set()函数。 - Markus84612
@Markus84612,我不确定我理解你的意思。如果你想要集合A和B之间的交集,只需执行setA&setB。如果您想保持集合A原始,请在操作之前复制列表。 - Woody1193

0

这是你想要的吗?

L1 = ['A', 'G', 'H', 'I', 'J', 'B']
L2 = ['A', 'B', 'C']

for i in L1:
    if i not in L2:
        print(i)

0

基于使用数学集合符号,为什么不使用集合呢?

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()函数也会移除列表A中的重复元素,但我不想这样,我只想移除两个列表的交集。 - Markus84612

0
list1 = ['string1','string2','string3']
list2 = ['string1','string2','string3','pussywagon'] 

newList = list(set(list2)-set(list1))

# output
print(newList)

# type
print(type(newList))

测试代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接