相关疑难解决方法(0)

列表理解与地图

是否有理由更喜欢使用map()超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?

python list-comprehension map-function

680
推荐指数
8
解决办法
19万
查看次数

列表理解中的双重迭代

在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 list-comprehension

202
推荐指数
9
解决办法
14万
查看次数

从类定义中的列表推导中访问类变量

如何从类定义中的列表推导中访问其他类变量?以下适用于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中删除.

python scope list-comprehension python-3.x python-internals

152
推荐指数
3
解决办法
2万
查看次数

为什么列表推导写入循环变量,但生成器不写?

如果我对列表推导做了些什么,它会写入一个局部变量:

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".

这种差异有什么好的理由吗?这是设计决策,还是生成器和列表推导的实现方式的随机副产品?就个人而言,如果列表推导没有写入局部变量,那对我来说似乎更好.

python list-comprehension generator python-2.7

76
推荐指数
3
解决办法
2331
查看次数

列表理解中的Lambdas在调用时返回lambda

我试图在列表中迭代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)

python lambda

53
推荐指数
2
解决办法
3624
查看次数

高级嵌套列表理解语法

我正在玩列表推导以更好地理解它们,我遇到了一些我无法解释的意外输出.我之前没有找到这个问题,但如果是/是/重复的问题,我道歉.

我本质上是在尝试编写一个生成生成器的生成器.使用列表推导的简单生成器如下所示:

(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)

python syntax scope list-comprehension

42
推荐指数
4
解决办法
5万
查看次数

使用python中的lambda表达式在循环内生成函数

如果我制作两个函数列表:

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)

为什么名单ab不相等?

例如:

>>> a[2]()
2
>>> b[2]()
9
Run Code Online (Sandbox Code Playgroud)

python lambda scope

29
推荐指数
3
解决办法
8761
查看次数

Python 2中的Eval范围与3

我在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)

python compatibility python-3.x python-3.4

26
推荐指数
1
解决办法
1587
查看次数

列表(生成器)的意外输出

我有一个列表和一个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)

两种结果都出乎意料地不同.为什么会这样?

python list-comprehension generator-expression python-2.7

20
推荐指数
3
解决办法
4555
查看次数

Python列表理解覆盖值

看看下面这段代码,它显示了一个列表理解.

>>> 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 closures list-comprehension

18
推荐指数
3
解决办法
1861
查看次数