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

Posted

技术标签:

【中文标题】列表理解中的动态自引用条件【英文标题】:Dynamic self-referencing conditional in list comprehension 【发布时间】:2016-07-18 17:07:16 【问题描述】:

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

后台代码:

arr = [2, 2, 4]
l = list()

期望的输出:

l = [2, 4]

通过 for 循环的期望行为:

for element in arr:
        if element not in l:
            l.append(element)

不正确的列表理解没有产生期望的行为:

l = [element for element in arr if element not in l]

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

【问题讨论】:

你不能改变你正在理解的同一个列表 我会用一套。 名称l 不会绑定到理解的结果,直到理解运行完成。 你否认了我所说的,但说的完全一样,只是措辞上的改动很少。正如@MadPhysicist 所说,名称l 尚未绑定。 @SwiftsNamesake 给了你一个解决方法。 @Remuze 我不想在 SO 上使用 pep8 玩具示例。 【参考方案1】:

如果您绝对必须使用列表理解,您可以将您的 for 循环重铸为一个。缺点是您最终会得到一个 None 元素列表,因为这是 list.append 返回的:

>>> 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 建议的生成器推导。这不会产生任何不需要的副产品,并且会完全按照您的意愿行事。

>>> arr = [2, 2, 4]
>>> l = list()
>>> l.extend(element for element in arr if element not in l)

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

>>> l = list(set(arr))

【讨论】:

【参考方案2】:

如果您想删除重复项,为什么不使用 set包含重复项的列表)或 list(dict.fromkeys(包含重复项的列表)?

但要回答您的问题:

我认为整个事情都是错误的,l(你的列表)不会随着每次迭代而更新,因为它在列表理解中

【讨论】:

以上是关于列表理解中的动态自引用条件的主要内容,如果未能解决你的问题,请参考以下文章

python列表理解中的多个IF条件

Java中多态的理解

如何遍历 Thymeleaf 中的自引用实体列表?

添加到 C 中的自引用结构列表?

使用Spark中的复杂条件和滞后自引用创建新列

根据.net核心中var中的条件插入对象列表/自定义模型列表