根据标题,我有一个像这样的嵌套列表(嵌套列表是固定长度):
# 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]))]
答案 0 :(得分:5)
>>> [[i for i, j in enumerate(c) if j is not None] for c in zip(*list1)]
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 2]]
在python-2.x中,您可以使用itertools.izip
代替zip
来避免生成中间列表。
答案 1 :(得分:1)
[[i for i in range(len(list1)) if list1[i] is not None] for _ in range(len(log[0]))]
上述内容似乎比我原来的帖子快了大约10倍。
答案 2 :(得分:0)
import numpy as np
map(lambda a: np.not_equal(a, None).nonzero()[0], np.transpose(list1))
# -> [array([0, 1, 2, 3]), array([0, 1, 2, 3]), array([0, 2])]