我被要求比较两个列表,并在第三个列表中筛选出唯一的值。我必须确保第三个列表只包含唯一值,不包含双精度值。
下面的代码可以工作:
import os, random
def makerange(number):
lijst = [random.randint(1,number) for item in
range(1,random.randint(2,number))]
return lijst
a = makerange(20)
b = makerange(20)
c = set()
for item in a:
if item in b and item not in c:
c.add(item)我尝试将for循环重写为python列表理解。
c = [ item for item in a if (item in b) & (item not in c)]然而,这个列表理解不起作用吗?有什么建议为什么这不起作用吗?我应该如何用列表理解来写这篇文章。
发布于 2016-02-23 06:00:53
你的代码不能工作,因为你不能引用c,因为它只有在理解完成后才会存在。
您还使用了错误的运算符;您需要使用and,而不是&;后者是按位运算,而不是布尔逻辑AND。它恰好在这里给出了相同的结果,但这只是运气。
下面的工作,使用一组理解来产生唯一的值:
c = {item for item in a if item in b}或者,如果您必须使用列表理解,可以使用单独的集合来跟踪您已经处理过的值;这个技巧取自How do you remove duplicates from a list in whilst preserving order?
seen = set()
c = [item for item in a if item in b and not (item in seen or seen.add(item))]但是你也可以使用set操作,在你的情况下是交叉的。
c = set(a).intersection(b)或者使用&运算符,该运算符对于集合也是重载的,以生成交集:
c = set(a) & set(b)Demo (非随机值,便于复制):
>>> a = [17, 8, 19, 17, 17, 4, 8, 17, 6, 19, 18, 11, 15, 8]
>>> b = [8, 9, 16, 7, 16, 14, 3, 19, 1, 17, 8, 11]
>>> {item for item in a if item in b and item not in c}
set([8, 17, 19, 11])
>>> set(a) & set(b)
set([8, 17, 11, 19])
>>> seen = set()
>>> [item for item in a if item in b and not (item in seen or seen.add(item))]
[17, 8, 19, 11]发布于 2016-02-23 06:01:48
您可以使用intersection代替set!
c = set(a).intersection(b)发布于 2016-02-23 06:02:42
这为你做了一个版本的工作。将a和b转化为集合,并取它们的交集。根据定义,集合不包含重复项。由于其他几个人指出的原因,原来的运算符无法工作:&在Python语言中是错误的运算符。
a = makerange(20)
b = makerange(20)
c = set(set(a).intersection(set(b)))输出:
set([20])https://stackoverflow.com/questions/35564719
复制相似问题