是否有理由更喜欢使用map()超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?
在Python中,您可以在列表推导中使用多个迭代器,例如
[(x,y) for x in a for y in b]
Run Code Online (Sandbox Code Playgroud)
对于一些合适的序列a和b.我知道Python列表推导的嵌套循环语义.
我的问题是:理解中的一个迭代器可以指向另一个吗?换句话说:我可以这样:
[x for x in a for a in b]
Run Code Online (Sandbox Code Playgroud)
外循环的当前值是内部的迭代器?
例如,如果我有一个嵌套列表:
a=[[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
列表理解表达式将实现此结果:
[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
?? (请仅列出理解答案,因为这是我想要找到的).
如何从类定义中的列表推导中访问其他类变量?以下适用于Python 2但在Python 3中失败:
class Foo:
x = 5
y = [x for i in range(1)]
Run Code Online (Sandbox Code Playgroud)
Python 3.2给出了错误:
NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)
尝试Foo.x也不起作用.有关如何在Python 3中执行此操作的任何想法?
一个稍微复杂的激励示例:
from collections import namedtuple
class StateDatabase:
State = namedtuple('State', ['name', 'capital'])
db = [State(*args) for args in [
['Alabama', 'Montgomery'],
['Alaska', 'Juneau'],
# ...
]]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,apply()本来是一个不错的解决方法,但它遗憾地从Python 3中删除.
如果我对列表推导做了些什么,它会写入一个局部变量:
i = 0
test = any([i == 2 for i in xrange(10)])
print i
Run Code Online (Sandbox Code Playgroud)
这打印"9".但是,如果我使用生成器,它不会写入局部变量:
i = 0
test = any(i == 2 for i in xrange(10))
print i
Run Code Online (Sandbox Code Playgroud)
这打印"0".
这种差异有什么好的理由吗?这是设计决策,还是生成器和列表推导的实现方式的随机副产品?就个人而言,如果列表推导没有写入局部变量,那对我来说似乎更好.
我试图在列表中迭代lambda func,因为test.py我想得到lambda的调用结果,而不是函数对象本身.但是,以下输出真的让我很困惑.
------test.py---------
#!/bin/env python
#coding: utf-8
a = [lambda: i for i in range(5)]
for i in a:
print i()
--------output---------
<function <lambda> at 0x7f489e542e60>
<function <lambda> at 0x7f489e542ed8>
<function <lambda> at 0x7f489e542f50>
<function <lambda> at 0x7f489e54a050>
<function <lambda> at 0x7f489e54a0c8>
Run Code Online (Sandbox Code Playgroud)
我在打印调用结果时修改了变量名t,如下所示,一切顺利.我想知道这是怎么回事.?
--------test.py(update)--------
a = [lambda: i for i in range(5)]
for t in a:
print t()
-----------output-------------
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud) 我正在玩列表推导以更好地理解它们,我遇到了一些我无法解释的意外输出.我之前没有找到这个问题,但如果是/是/重复的问题,我道歉.
我本质上是在尝试编写一个生成生成器的生成器.使用列表推导的简单生成器如下所示:
(x for x in range(10) if x%2==0) # generates all even integers in range(10)
Run Code Online (Sandbox Code Playgroud)
我试图做的是编写一个生成两个生成器的生成器 - 第一个生成范围(10)中的偶数,第二个生成范围(10)中的奇数.为此,我做了:
>>> (x for x in range(10) if x%2==i for i in range(2))
<generator object <genexpr> at 0x7f6b90948f00>
>>> for i in g.next(): print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in …Run Code Online (Sandbox Code Playgroud) 如果我制作两个函数列表:
def makeFun(i):
return lambda: i
a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
为什么名单a和b不相等?
例如:
>>> a[2]()
2
>>> b[2]()
9
Run Code Online (Sandbox Code Playgroud) 我在Python 3中遇到了奇怪的eval行为 - 当在列表推导中调用eval时,不会拾取局部变量.
def apply_op():
x, y, z = [0.5, 0.25, 0.75]
op = "x,y,z"
return [eval(o) for o in op.split(",")]
print(apply_op())
Run Code Online (Sandbox Code Playgroud)
它在Python 3中出错:
? python --version
Python 3.4.3
? python eval.py
Traceback (most recent call last):
File "eval.py", line 7, in <module>
print(apply_op())
File "eval.py", line 5, in apply_op
return [eval(o) % 1 for o in op.split(",")]
File "eval.py", line 5, in <listcomp>
return [eval(o) % 1 for o in op.split(",")]
File "<string>", line 1, in <module>
NameError: …Run Code Online (Sandbox Code Playgroud) 我有一个列表和一个lambda定义为的函数
In [1]: i = lambda x: a[x]
In [2]: alist = [(1, 2), (3, 4)]
Run Code Online (Sandbox Code Playgroud)
然后我尝试两种不同的方法来计算一个简单的总和
第一种方法.
In [3]: [i(0) + i(1) for a in alist]
Out[3]: [3, 7]
Run Code Online (Sandbox Code Playgroud)
第二种方法.
In [4]: list(i(0) + i(1) for a in alist)
Out[4]: [7, 7]
Run Code Online (Sandbox Code Playgroud)
两种结果都出乎意料地不同.为什么会这样?
看看下面这段代码,它显示了一个列表理解.
>>> i = 6
>>> s = [i * i for i in range(100)]
>>> print(i)
Run Code Online (Sandbox Code Playgroud)
当您在Python 2.6中执行代码示例时,它会打印99,但是当您在Python 3.x中执行它时,它会打印6.
是什么改变行为的原因,以及为什么是输出6中的Python 3.x的?
先感谢您!
python ×10
scope ×3
lambda ×2
python-2.7 ×2
python-3.x ×2
closures ×1
generator ×1
map-function ×1
python-3.4 ×1
syntax ×1