用 python 中的重复元素减去 2 个列表
Subtract 2 lists by duplicate elements in python
你好,我想知道如何在 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
试试这个
>>> 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']
你可以做一个列表理解..
[x for x in listA if x not in listB]
使用 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。
这就是你想要的?
L1 = ['A', 'G', 'H', 'I', 'J', 'B']
L2 = ['A', 'B', 'C']
for i in L1:
if i not in L2:
print(i)
在使用数学集合符号的基础上,为什么不使用集合?
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'}
你好,我想知道如何在 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
试试这个
>>> 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']
你可以做一个列表理解..
[x for x in listA if x not in listB]
使用 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。
这就是你想要的?
L1 = ['A', 'G', 'H', 'I', 'J', 'B']
L2 = ['A', 'B', 'C']
for i in L1:
if i not in L2:
print(i)
在使用数学集合符号的基础上,为什么不使用集合?
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'}