繁体   English   中英

Python:在列表理解本身中引用列表理解?

[英]Python: Referring to a list comprehension in the list comprehension itself?

这个想法刚刚出现在我的脑海中。 无论出于何种原因,您都想通过 Python 中的列表理解来获取列表的唯一元素。

[i if i in {created_comprehension} else 0 for i in [1, 2, 1, 2, 3]

[1, 2, 0, 0, 3]

我不知道,我真的没有这个目的,但是如果可以在创建时引用理解,那会很酷。

(例如, 如何使用列表理解从列表中删除重复项?是一个类似的问题)

我会假设i in {created_comprehension}中的意思是i not in {created_comprehension} 至少数据表明是这样。

所以这是一个有趣的可怕的虐待,我不相信它总是有效。 主要是为了证明“这是不可能的,因为它尚未分配”的论点是错误的。 虽然列表对象确实还没有分配,它确实存在,而它的在建。

>>> import gc
>>> [i if i not in self else 0
     for ids in [set(map(id, gc.get_objects()))]
     for self in [next(o for o in gc.get_objects() if o == [] and id(o) not in ids)]
     for i in [1, 2, 1, 2, 3]]
[1, 2, 0, 0, 3]

这会在新列表创建之前获取所有被垃圾回收跟踪的对象的 id,然后创建新列表,我们通过搜索新跟踪的空列表来找到它。 调用它self然后你就可以使用它了。 所以中间的两行是一个通用的食谱。 我也成功地将它用于这个问题,但在我发布之前它就被关闭了。

一个更好的版本:

>>> [i if i not in self else 0
     for old in [ids()] for self in [find(old)]
     for i in [1, 2, 1, 2, 3]]
[1, 2, 0, 0, 3]

使用了这些辅助函数:

def ids():
    import gc
    return set(map(id, gc.get_objects()))

def find(old):
    import gc
    return next(o for o in gc.get_objects() if o == [] and id(o) not in old)

免责声明:这纯粹是我的猜测,我没有数据支持

我认为您不能在构建列表理解时参考它。 Python首先必须创建列表,分配内存或它,并向其中添加元素,然后将其绑定到变量名。 因此,我认为如果您尝试引用该列表,则最终会出现NameError ,而它是在 list-comp 中构建的

因此,您最终可能需要一个set来保存您的独特之处,并从那里建立您的列表(天哪!这太糟糕了):

In [11]: L = [1, 2, 1, 2, 3]

In [12]: s = set(L)

In [13]: answer = [sub[0] for sub in [(i,s.remove(i)) if i in s else (0,0) for i in L]]

In [14]: answer
Out[14]: [1, 2, 0, 0, 3]

In [15]: s
Out[15]: set()

免责声明:这只是一个实验。 我比较一个list comprehensionlist一个内部list comprehension

我希望x包含来自[1,2,1,2,3,4,5]元素,仅当这些元素在此list comprehension [e for e in range(3,6)]应该是[3,4,5]

x = [i for a in [e for e in range(3,6)] for i in [1,2,1,2,3,4,5] if i == a]

输出是正确的:

[3, 4, 5]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM