假设我有一个列表列表,例如:
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)
有没有一种可能的方法可以调用所有子列表并访问它们的元素,而无需遍历整个列表来创建新的子列表?您能否比较时间并描述为什么我们不能调用所有子列表或某个范围的子列表来从每个子列表中获取元素而不循环两次,一次获取子列表,一次访问每个子列表?
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)
从“ transpose”的列表版本开始:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句