Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:按理解访问列表_Python_Python 3.x_List Comprehension - Fatal编程技术网

Python:按理解访问列表

Python:按理解访问列表,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,是否有一种方法可以访问所理解的列表?特别是,我想再次迭代已经添加的元素 例如,我在寻找这样的东西: [x for x in range(foo) if x not in self] 或 其中self就是刚刚理解的列表本身。首先,any(self中y代表y)就是any(self) 其次,你的函数不会做任何事情。你实际上写的是: res = [] for x in range(foo): if any(res): res.append(x) 这只是一个空列表 您需要的是一

是否有一种方法可以访问所理解的列表?特别是,我想再次迭代已经添加的元素

例如,我在寻找这样的东西:

[x for x in range(foo) if x not in self]

其中self就是刚刚理解的列表本身。

首先,
any(self中y代表y)
就是
any(self)

其次,你的函数不会做任何事情。你实际上写的是:

res = []
for x in range(foo):
    if any(res):
        res.append(x)
这只是一个空列表

您需要的是一套

res = set(values)
如果您关心订单,您可以执行以下操作:

seen = set()
[x for x in values if x not in seen and not seen.add(x)]

简言之:不,你不能这样做。Python的列表理解(以及生成器表达式等相关结构)不如Haskell的惰性列表(它可以做您想要的事情)强大。语法类似,但Python不是一种纯粹的函数式语言,它的语法特性是惰性的、递归的求值;它的解释器不够复杂,无法理解和处理这样的行为

更复杂的答案:在特定情况下,您可以通过误用列表理解(例如,acushner回答中使用的
set
更新hack)绕过它。但列表理解通常应该努力转换和过滤现有数据;他们不应该执行副作用的其他工作,因为这会使代码更加复杂,使维护人员感到困惑。列表理解是一种功能模式;副作用显然是不起作用的,所以人们不会去寻找或期待它们。如果您需要这样做,那么编写一个函数(可能是生成器函数)是一个更好的主意,该函数可以隔离复杂性,并维护跟踪迄今为止生成的值的内部状态。本手册中提供的各种非定量配方就是一个很好的例子


变得相当高级:Haskell可以做到这一点,因为它的列表理解可以是惰性的,但可以重用(它有内存)。这样Haskell就可以吃蛋糕了;列表可以根据前面的元素定义元素,因为这些元素将在需要时生成,并且可以多次读取。Python将惰性与可重用性分开。一个列表的理解是热切的评价;在它实际绑定到您可以用来访问它的名称之前,它完成了填充(因此它无法在构建时从中间列表中读取值)。生成器表达式大多是惰性的(它绑定了它热切工作的iterable,但其他一切都是惰性的),因此在对其求值时,它可以绑定到一个名称,但它没有内存;您不能在genexpr中使用来自genexpr的值,因为这样做必然会推进生成器(在大多数情况下,我可以想到,这会导致无限递归,因为它试图根据下一个结果反复定义下一个结果)。

您不能,这是我最近遇到的一个问题,没有这样做的方法。你只需要使用一个常规的for循环和list。append()a
list
comprehension是
list
的字面表达式。你不能在它被创建之前检查它。那么它可以用生成器来完成吗?@Slimior:不,无论如何都不能以可怕的方式扭曲Python。Haskell理解可以这样递归地定义,Python不能这样定义。@ShadowRanger补充说,作为一个答案,你确切地告诉了我需要什么这并没有回答我的问题。使用
any()
的示例只是为了简单地表明我希望能够迭代已经生成的项,实际目的更复杂,并且无法使用
set
完成。已经考虑过了;)这方面的具体用例是什么?
seen = set()
[x for x in values if x not in seen and not seen.add(x)]