Python “怎么做?”;而不是c.附加(x)“;在这里工作?

Python “怎么做?”;而不是c.附加(x)“;在这里工作?,python,filtering,list-comprehension,Python,Filtering,List Comprehension,尝试解决简单的练习:使用列表理解找到两个列表的公共部分,不要重复。在线找到解决方案,但不了解最后一点。这是一个复合过滤器,但我不知道“not c.append(elem)”如何解析为布尔值 from random import randrange a = [] b = [] c = [] for x in range(randrange(15, 20)): a.append(randrange(1, 20)) b.append(randrange(1, 20)) a.sor

尝试解决简单的练习:使用列表理解找到两个列表的公共部分,不要重复。在线找到解决方案,但不了解最后一点。这是一个复合过滤器,但我不知道“not c.append(elem)”如何解析为布尔值

from random import randrange

a = []
b = []
c = []

for x in range(randrange(15, 20)):
    a.append(randrange(1, 20))
    b.append(randrange(1, 20))

a.sort()

print(a)
print(b)

c = [elem for elem in a if elem in b and elem not in c and not c.append(elem)]
print(c)
这只是关于“而不是c.append(elem)”。

把它拆开:

... elem not in c and not c.append(elem)
本部分首先检查
elem
是否在
c
中(注意:前面声明为
c=[]
c
),如果不是,则将其附加到
c
。因为
list.append
总是返回
None
,这是一个错误的值。在将结果转换为
True
之前,
not
,因此该元素也由列表提取

该代码有效地过滤出
a
b
中唯一的公共元素,并等效于以下代码:

list\u comp\u result=[]
对于a中的元素:
如果b中的元素:
如果元素不在c中:

c、 追加(elem)#仅用于追加elem

c.append(elem) = None

不是c.append(elem)总是正确的

这是一种将副作用放入理解的不太好的方式。在这种情况下,你可以使用:
d=list(set(a)和set(b))
+如果在处理过程中不使用
而不使用c.append(elem)
c=[]
直到[…]完成,c=[…]的结果。+如果使用
而不是c.append(elem)]
则在处理过程中,c更改为code1=``c=[a中的元素如果元素在b中且元素不在c中且元素不在c中追加(元素)]打印(c)``code2=````[a中的元素如果元素在b中且元素不在c中且元素不在c中追加(元素)]打印(c)``code3=``如果元素在b中:如果元素不在c中追加(元素)打印(c)``code1=code2=code3