4

Python中的单行循环只能用于构建列表吗?(即列表推导),还是可以用于更通用的计算?

例如,我知道 Python 中的列表推导(~单行循环),例如

my_list = [ 2*i for i in range(10)]

也可以用多行循环构建:

my_list = []
for i in range(10):
    my_list.append(2*i)

但是我们能把一般的多线循环转换成单线循环吗?

例如,假设我们有以下多行 for 循环:

my_array = np.ones(10*10)

for x in range(10):
     my_array[x,:] = 0

我们可以将其转换为单行循环吗?更普遍:

Q1。这两种形式在功能上是等价的吗?(即它们支持相同的操作/操作集)

Q2。我想我之前读过 Python 中的单行循环是矢量化的。这是真的?这是否意味着它们可以比多行循环更快地迭代?

4

2 回答 2

5

但是我们是否总是可以将 Python 中的一般多行循环转换为单行循环?

最简洁的答案是不。

列表推导适用于投影(映射)和/或过滤。

例如,如果您有这样的代码:

result = []
for x in seq:
    if bar(x):
        result.append(foo(x))

然后,正如您所指出的,它可以从重写为列表理解中受益:

result = [foo(x) for f in seq if bar(x)]

然而,列表推导通常不适合不适合此投影或过滤模式的操作。

例如,如果您需要改变元素但不需要结果,则列表推导不适合。以下代码不方便编写为列表推导式(假设两种方法都返回None):

for x in seq:
    x.foo()    # Modify x
    x.bar()    # Modify x again

理解中不允许某些操作。一个例子是,如果满足条件,则提前退出循环:

for x in seq:
    if x.foo():
        break
    else:
        x.bar()
于 2012-12-03T23:02:39.280 回答
2

我要指出的一件事是它不仅仅是列表,您可以使用理解来创建集合甚至字典。

>>> {i**2 for i in range(5)}
set([0, 1, 4, 16, 9])
>>> {i : str(i) for i in range(5)}
{0: '0', 1: '1', 2: '2', 3: '3', 4: '4'}

此外,列表理解通常比使用append多次(如您的示例)更快,因为理解是由底层 C 代码完成的,而不是append具有额外 Python 层的 .

当然,理解与其他任何事物一样有局限性。如果您想对列表/集合的每个元素执行更大的操作集,那么普通循环可能更合适。

于 2012-12-03T23:06:28.387 回答