首页 > 解决方案 > 从多维列表的每个子列表中访问给定元素而不使用 for 循环

问题描述

假设我有一个列表列表,例如:

list0 = [[a, .5, .3], [b, .3, .8], [c, .7, 1.3], [d, 1.03, .2]]

我想调用每个子列表的第二个元素以输出到我认为这可行的列表。

输入:print(list0[:][1])

输出:[b, .3, .8]

但我希望得到这个:(.5, .3, .7, 1.03)

有没有一种方法可以调用所有子列表并访问它们的元素,而无需遍历整个列表来创建新列表?您能否比较时间并描述为什么我们不能调用所有或一系列子列表来从每个子列表中获取一个元素而不循环两次,一次获取子列表,一次访问每个子列表?

标签: pythonarrayslistnumpy

解决方案


In [196]: list0 = [['a', .5, .3], ['b', .3, .8], ['c', .7, 1.3], ['d', 1.03, .2]]

一些比较时间:

推荐的列表理解:

In [197]: timeit [l[1] for l in list0]
410 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

从“转置”的列表版本开始:

In [198]: timeit list(zip(*list0))[1]
661 ns ± 3.63 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

从数组中选择一列:

In [199]: timeit np.array(list0)[:,1]
16 µs ± 177 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

numpy问题经常问“没有循环”的原因是 numpy 数组上的 Python 级迭代很慢。在可能的情况下,我们希望使用快速编译的 numpy 代码(仍然有循环)。但是从列表开始时,创建数组的成本相对较高。

从数组开始,列索引很快:

In [200]: %%timeit A = np.array(list0)
     ...: A[:,1]
325 ns ± 11.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

数组上的迭代比列表上的相同迭代慢:

In [201]: %%timeit A = np.array(list0)
     ...: [a[1] for a in A] 
5.47 µs ± 96.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

推荐阅读