这个想法刚出现在我的脑海里。无论出于何种原因,您都希望通过Python中的列表理解来获取列表的唯一元素。
[i if i in {created_comprehension} else 0 for i in [1, 2, 1, 2, 3]
[1, 2, 0, 0, 3]
我不知道,我真的没有这个目的,但如果有可能在理解中被引用,那就太酷了。
(例如this one是一个类似的问题)
答案 0 :(得分:1)
免责声明:这纯粹是对我的猜测,我没有数据支持
我不认为你可以参考列表理解,因为它正在构建。在将变量名绑定到变量名之前,Python首先必须创建列表,分配内存或者向它添加元素。因此,如果您尝试引用列表,我认为您最终会得到一个NameError
,而它是在list-comp中构建的
因此,你最终可能需要一个set
来保持你的独特性,并从那里建立你的清单(哦,上帝!这是hacky):
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()
答案 1 :(得分:0)
免责声明:这只是一个实验。我比较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]
答案 2 :(得分:0)
我假设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
,然后就可以使用它了。因此,中间两行是一般的配方。我还成功地将其用于this question,但在发布之前已关闭。
更好的版本:
>>> [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)