如何获取Python子列表中所有非None项的索引?
根据标题,我有一个嵌套列表,像这样(这个嵌套列表的长度是固定的):
# 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
,这样可以避免生成中间的列表。