2010-11-06 152 views

回答

49
[i for i, e in enumerate(a) if e != 0] 
+0

谢谢你,那真是太快了! – 2010-11-06 01:46:08

+0

让我想起itertools.compress,但它不是枚举而是拉链。 – 2010-11-06 01:58:47

+0

只是'如果e'也适用 – keyser 2015-05-06 12:40:13

6

由于THC4k提到压缩(在python2.7 +提供)

>>> from itertools import compress, count 
>>> x = [0, 1, 0, 1, 0, 0, 0, 0] 
>>> compress(count(), x) 
<itertools.compress object at 0x8c3666c> 
>>> list(_) 
[1, 3] 
+0

+1,尽管通过使用“_”最后一个结果绑定到作为参数传递给list()函数/类型的迭代器对象,使得事实上几乎不存在的解释变得更加模糊。 – martineau 2010-11-06 09:33:07

27

不是一个真正的 “新” 的答案,但numpy有这种内置的为好。

import numpy as np 
a = [0, 1, 0, 1, 0, 0, 0, 0] 
nonzeroind = np.nonzero(a)[0] # the return is a little funny so I use the [0] 
print nonzeroind 
[1 3] 
+0

这很酷!我需要在Cinema-4D中使用一些Python脚本,所以当时它仅仅为此而没有意义。 numpy看起来非常好!感谢分享! – 2011-05-26 22:39:08

+1

我还提供numpy然后其他答案...这更容易理解......它更符合逻辑,更多,如果你来自matalb :-) – otmezger 2013-03-18 20:57:52

2

只是希望为前面的“滑稽”输出添加解释。结果是一个元组,其中包含矩阵每个维度的索引向量。在这种情况下,用户正在处理numpy中被认为是矢量的东西,所以输出是一个元素的元组。

import numpy as np 
a = [0, 1, 0, 1, 0, 0, 0, 0] 
nonzeroind = np.nonzero(a) 
print nonzeroind 
(array([1, 3]),) 
相关问题