首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表理解中的动态自引用条件

列表理解中的动态自引用条件
EN

Stack Overflow用户
提问于 2016-03-30 15:23:47
回答 2查看 1.1K关注 0票数 9

:在列表理解中创建一个条件语句,(1)动态测试--即在每次迭代时--如果元素不在要理解的列表中,(2)列表本身在每次迭代中被更新。

背景代码:

代码语言:javascript
复制
arr = [2, 2, 4]
l = list()

期望输出:

代码语言:javascript
复制
l = [2, 4]

想要的行为通过for循环:

代码语言:javascript
复制
for element in arr:
        if element not in l:
            l.append(element)

错误列表理解 not 生成所需行为:

代码语言:javascript
复制
l = [element for element in arr if element not in l]

问题重述:如何修正列表理解,使其生成所需的行为,即上面所述的期望输出?

EN

回答 2

Stack Overflow用户

发布于 2016-03-30 15:33:28

如果您绝对必须使用list comprehesion,您可以将您的for循环重新组合成一个。缺点是,您将得到一个None元素列表,因为这是list.append返回的内容:

代码语言:javascript
复制
>>> arr = [2, 2, 4]
>>> l = list()
>>> _ = [l.append(element) for element in arr if element not in l]
>>> print(l)
[2, 4]
>>> print(_)
[None, None]

如果你与理解联系在一起,但不一定要列出理解,你可以使用@tdelaney建议的生成器理解。这将不会产生任何不必要的副产品,并将完全做你想要的。

代码语言:javascript
复制
>>> arr = [2, 2, 4]
>>> l = list()
>>> l.extend(element for element in arr if element not in l)

一种比这两种方法都更好的方法可能是将原始列表放入一个集合,然后返回到一个列表中。使用集合扩展列表的优点是,在检查之前的包含后,set添加元素的速度要快得多。列表必须在每次添加元素时进行线性搜索和重新分配。

代码语言:javascript
复制
>>> l = list(set(arr))
票数 3
EN

Stack Overflow用户

发布于 2020-04-04 16:34:14

如果要删除重复项,为什么不使用set(包含重复项的列表)或包含重复项的列表?

但要回答你的问题:

我认为整件事都是错的,我(你的列表)没有每次迭代更新,因为它在列表理解中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36313182

复制
相关文章

相似问题

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