可以从列表理解中返回两个列表吗?

Lar*_*gas 39 python list-comprehension

是否可以从列表理解中返回两个列表?嗯,这显然不起作用,但是类似于:

rr, tt = [i*10, i*12 for i in xrange(4)]
Run Code Online (Sandbox Code Playgroud)

所以rrtt都是从搜索结果列表i*10i*12分别.非常感谢

jam*_*lak 62

>>> rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])
>>> rr
(0, 10, 20, 30)
>>> tt
(0, 12, 24, 36)
Run Code Online (Sandbox Code Playgroud)

  • 只运行两个单独的列表推导更简单,但可能更快. (4认同)
  • @thavan`*`将列表解析解压缩为`zip`的参数.您可以查看"list unpacking"以获取更多信息. (2认同)

tot*_*ico 6

创建两个理解列表更好(至少对于长列表而言)。请注意,投票最好的答案可能比传统的for循环还要慢。列表理解更快,更清晰

python -m timeit -n 100 -s 'rr=[];tt = [];' 'for i in range(500000): rr.append(i*10);tt.append(i*12)' 
10 loops, best of 3: 123 msec per loop

> python -m timeit -n 100 'rr,tt = zip(*[(i*10, i*12) for i in range(500000)])' 
10 loops, best of 3: 170 msec per loop

> python -m timeit -n 100 'rr = [i*10 for i in range(500000)]; tt = [i*10 for i in range(500000)]' 
10 loops, best of 3: 68.5 msec per loop
Run Code Online (Sandbox Code Playgroud)

很高兴看到列表理解一次支持多个列表的创建。

然而,

如果您可以利用使用传统循环(准确地说是中间计算)的优势,那么使用循环(或iterator/generator使用yield)可能会更好。这是一个例子:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in (range(1000) for x in range(10000)): tmp = list(i); rr.append(min(tmp));tt.append(max(tmp))" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min(list(i)) for i in (range(1000) for x in range(10000))];tt=[max(list(i)) for i in (range(1000) for x in range(10000))]"
100 loops, best of 3: 413 msec per loop
Run Code Online (Sandbox Code Playgroud)

当然,在这些情况下进行比较是不公平的;在该示例中,代码和计算并不等效,因为在传统循环中会存储一个临时结果(请参见tmp变量)。因此,列表推导进行了更多的内部操作(它两次计算了tmp变量!,但仅慢了25%)。