Python:参考列表理解本身的列表理解?

时间:2015-11-12 06:23:47

标签: python list list-comprehension

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

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

[1, 2, 0, 0, 3]

我不知道,我真的没有这个目的,但如果有可能在理解中被引用,那就太酷了。

(例如this one是一个类似的问题)

3 个答案:

答案 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内的listlist 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)