如何获取Python子列表中所有非None项的索引?

2 投票
3 回答
4491 浏览
提问于 2025-04-15 22:22

根据标题,我有一个嵌套列表,像这样(这个嵌套列表的长度是固定的):

        # ID,  Name, Value
list1 = [[ 1, "foo",    10],
         [ 2, "bar",  None],
         [ 3, "fizz",   57],
         [ 4, "buzz", None]]

我想返回一个列表(这个列表的项数和list1中子列表的长度相等),其中子列表是那些在第X个位置没有None的行的索引,也就是说:

[[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]))]

3 个回答

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])]
1
[[i for i in range(len(list1)) if list1[i] is not None] for _ in range(len(log[0]))]

上面的内容看起来比我最初的帖子快了大约10倍。

7
>>> [[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,这样可以避免生成中间的列表。

撰写回答