繁体   English   中英

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

[英]Possible to return two lists from a list comprehension?

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

rr, tt = [i*10, i*12 for i in xrange(4)]

所以rrtt都是分别来自i*10i*12的结果的列表。 非常感谢

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

创建两个理解列表更好(至少对于长列表)。 请注意,最佳投票答案可能比传统的 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

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

然而,

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

$ 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

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

如果元素是列表,列表推导式可以返回多个列表。 例如:

>>> x, y = [[] for x in range(2)]
>>> x
[]
>>> y
[]
>>>

使用zip函数的技巧可以完成这项工作,但如果您只是将结果收集在带有循环的列表中,则实际上更简单和易读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM