单python列表理解中的两个赋值

单python列表理解中的两个赋值,python,list-comprehension,Python,List Comprehension,例如: a = [1,2,3] x = [2*i for i in a] y = [3*i for i in a] 如果a的大小很大,将列表理解合并为一个(如果可能)会更有效吗?如果是,你是如何做到的 大概 x,y = [2*i, 3*i for i in a] 这不管用。如果使用列表理解在计算效率上并不比使用普通for循环更高,也请告诉我。谢谢。您希望与星形操作符一起使用来完成此操作zip()通常将列表转换为成对列表,当像这样使用时,它会解压-将成对列表拆分为两个列表 >>&g

例如:

a = [1,2,3]
x = [2*i for i in a]
y = [3*i for i in a]
如果a的大小很大,将列表理解合并为一个(如果可能)会更有效吗?如果是,你是如何做到的

大概

x,y = [2*i, 3*i for i in a]
这不管用。如果使用列表理解在计算效率上并不比使用普通for循环更高,也请告诉我。谢谢。

您希望与星形操作符一起使用来完成此操作
zip()
通常将列表转换为成对列表,当像这样使用时,它会解压-将成对列表拆分为两个列表

>>> a = [1, 2, 3]
>>> x, y = zip(*[(2*i, 3*i) for i in a])
>>> x
(2, 4, 6)
>>> y
(3, 6, 9)

请注意,我不确定这在某种意义上是否真的更有效。

如果对效率有疑问,请使用timeit模块,它总是很容易使用:

import timeit

def f1(aRange):
    x = [2*i for i in aRange]
    y = [3*i for i in aRange]
    return x,y

def f2(aRange):
    x, y = zip(*[(2*i, 3*i) for i in aRange])
    return x,y

def f3(aRange):
    x, y = zip(*((2*i, 3*i) for i in aRange))
    return x,y

def f4(aRange):
    x = []
    y = []
    for i in aRange:
        x.append(i*2)
        y.append(i*3)
    return x,y

print "f1: %f" %timeit.Timer("f1(range(100))", "from __main__ import f1").timeit(100000)
print "f2: %f" %timeit.Timer("f2(range(100))", "from __main__ import f2").timeit(100000)
print "f3: %f" %timeit.Timer("f3(range(100))", "from __main__ import f3").timeit(100000)
print "f4: %f" %timeit.Timer("f4(range(100))", "from __main__ import f4").timeit(100000)
结果似乎一致地指出第一个选项是最快的

f1: 2.127573
f2: 3.551838
f3: 3.859768
f4: 4.282406

后一个列表理解返回一个元组列表,然后尝试将其分配给一个元组,这就是失败的原因。您可以在以后将其展平为两个单独的列表,但我不能说哪一个更有效。您可以考虑将一个对列表转换为一对列表。@user1473483关于
x,y=[[a中I的2*I],[a中I的3*I]]
?效率在这里并不重要(因为循环很便宜),但是如果
a
是一个只能使用一次的生成器,或者'xy=[(2*i,3*i)表示a中的i]'您可以使用生成器而不是列表理解
x,y=zip(*((2*i,3*i)表示a中的i))
(如果有区别的话)@jadkik94因为你要用zip使用所有的值,所以几乎没有区别,尽管你说的是真的。@jadkik94似乎是最慢的选项,请检查我的答案。@Lattyware我真的很惊讶它居然能工作,打开发电机的包装。。。所以我想和大家分享:)结果是速度慢了一些:(@jadkik94:我相信与构建临时容器相比,生成器的主要优势在于它需要更少的内存。听起来这是永久性的内存与速度的权衡……这是一个非常好的观点。我认为第一种选择可能是最清晰和最快的。唯一的首选时间是如果
aRange
是一个耗尽的生成器,那么使用此方法可以避免使用
tee()
或临时列表。