[英]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 comprehension
和list
一个内部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.