【发布时间】:2010-05-05 10:59:32
【问题描述】:
根据标题,我有一个这样的嵌套列表(嵌套列表是固定长度):
# ID, Name, Value
list1 = [[ 1, "foo", 10],
[ 2, "bar", None],
[ 3, "fizz", 57],
[ 4, "buzz", None]]
我想返回一个列表(项目数等于来自list1 的子列表的长度),其中子列表是没有 None 作为第 X 项的行的索引,即:
[[non-None ID indices], [non-None Name indices], [non-None Value indices]]
以list1为例,结果应该是:
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 2]]
我目前的实现是:
indices = [[] for _ in range(len(list1[0]))]
for i, row in enumerate(list1):
for j in range(len(row)):
if not isinstance(row[j], types.NoneType):
indices[j].append(i)
...可行,但可能很慢(列表的长度为数十万)。
有没有更好/更有效的方法来做到这一点?
编辑:
我已将上述 for 循环重构为嵌套列表理解(类似于 SilentGhost 的答案)。以下行给出了与我最初的实现相同的结果,但运行速度大约快了 10 倍。
[[i for i in range(len(list1)) if list1[i][j] is not None] for j in range(len(log[0]))]
【问题讨论】:
-
您编辑的变体无效,因为
list1[i]始终不是None例如,list1[0]是[1, "foo", 10](注意:[None, None, None] is not None)。 -
谢谢 - 我想我现在已经修好了。
标签: python list list-comprehension