python - 从多维列表的每个子列表中访问给定元素而不使用 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)
有没有一种方法可以调用所有子列表并访问它们的元素,而无需遍历整个列表来创建新列表?您能否比较时间并描述为什么我们不能调用所有或一系列子列表来从每个子列表中获取一个元素而不循环两次,一次获取子列表,一次访问每个子列表?
解决方案
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)
推荐阅读
- javascript - 在 javascript 中,数组显示“按值传递”行为而不是“按引用传递”
- python - 如何确定python整数形式的表达式的值?
- mongodb - 无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 java.util.List
- jquery - 使用 jquery 抓取网站时出现 TypeError
- mysql - 如何使用两个表和辅助表编写查询?
- aws-secrets-manager - AWS (ResourceNotFoundException) 调用 GetSecretValue 操作时:Secrets Manager 找不到指定的密钥
- python - 如何在子进程命令行中传递字符串路径?
- wildfly-10 - Wildfly 10 缺少/不可用的依赖项
- bash - 通过 JQ 和 BASH/SHELL 获取 JSON 文档的第三个元素
- docker - 编辑 Dockerfile,使图像不在交互式 shell 中运行,而是从 ENTRYPOINT