首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python列表理解if子句创建具有唯一值的列表不可用

使用python列表理解if子句创建具有唯一值的列表不可用
EN

Stack Overflow用户
提问于 2016-02-23 05:55:36
回答 4查看 988关注 0票数 0

我被要求比较两个列表,并在第三个列表中筛选出唯一的值。我必须确保第三个列表只包含唯一值,不包含双精度值。

下面的代码可以工作:

代码语言:javascript
复制
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列表理解。

代码语言:javascript
复制
c = [ item for item in a if (item in b) & (item not in c)]

然而,这个列表理解不起作用吗?有什么建议为什么这不起作用吗?我应该如何用列表理解来写这篇文章。

EN

回答 4

Stack Overflow用户

发布于 2016-02-23 06:00:53

你的代码不能工作,因为你不能引用c,因为它只有在理解完成后才会存在。

您还使用了错误的运算符;您需要使用and,而不是&;后者是按位运算,而不是布尔逻辑AND。它恰好在这里给出了相同的结果,但这只是运气。

下面的工作,使用一组理解来产生唯一的值:

代码语言:javascript
复制
c = {item for item in a if item in b}

或者,如果您必须使用列表理解,可以使用单独的集合来跟踪您已经处理过的值;这个技巧取自How do you remove duplicates from a list in whilst preserving order?

代码语言:javascript
复制
seen = set()
c = [item for item in a if item in b and not (item in seen or seen.add(item))]

但是你也可以使用set操作,在你的情况下是交叉的。

代码语言:javascript
复制
c = set(a).intersection(b)

或者使用&运算符,该运算符对于集合也是重载的,以生成交集:

代码语言:javascript
复制
c = set(a) & set(b)

Demo (非随机值,便于复制):

代码语言:javascript
复制
>>> 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]
票数 5
EN

Stack Overflow用户

发布于 2016-02-23 06:01:48

您可以使用intersection代替set!

代码语言:javascript
复制
c = set(a).intersection(b)
票数 2
EN

Stack Overflow用户

发布于 2016-02-23 06:02:42

这为你做了一个版本的工作。将a和b转化为集合,并取它们的交集。根据定义,集合不包含重复项。由于其他几个人指出的原因,原来的运算符无法工作:&在Python语言中是错误的运算符。

代码语言:javascript
复制
a = makerange(20)
b = makerange(20)
c = set(set(a).intersection(set(b)))

输出:

代码语言:javascript
复制
set([20])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35564719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档