使用python list comprehension根据条件查找元素索引

Finding the index of elements based on a condition using python list comprehension

下面的python代码在来自matlab背景时看起来非常冗长。

1
2
3
>>> a = [1, 2, 3, 1, 2, 3]
>>> [index for index,value in enumerate(a) if value > 2]
[2, 5]

在Matlab中,我可以写:

1
2
3
4
>> a = [1, 2, 3, 1, 2, 3];
>> find(a>2)
ans =
     3     6

是否有一个用Python编写这个的速记方法,或者我只是坚持使用长版本?

感谢您对Python语法基本原理的所有建议和解释。

在numpy网站上找到以下内容后,我认为我找到了一个我喜欢的解决方案:

http://docs.scipy.org/doc/numpy/user/basics.indexing.html布尔或掩码索引数组

将该网站上的信息应用于我的上述问题,将给出以下信息:

1
2
3
4
5
6
7
>>> from numpy import array
>>> a = array([1, 2, 3, 1, 2, 3])
>>> b = a>2
array([False, False, True, False, False, True], dtype=bool)
>>> r = array(range(len(b)))
>>> r(b)
[2, 5]

接下来应该可以使用以下代码(但我手头没有python解释器来测试它):

1
2
3
4
5
6
7
8
9
class my_array(numpy.array):
    def find(self, b):
        r = array(range(len(b)))
        return r(b)


>>> a = my_array([1, 2, 3, 1, 2, 3])
>>> a.find(a>2)
[2, 5]


  • 在python中,根本不需要使用索引,只需要处理值-EDOCX1-4。通常,处理索引意味着你做的不是最好的方法。

  • 如果您确实需要一个类似于matlab的API,那么您将使用numpy,一个多维数组包和python中的数字数学,它深受matlab的启发。您将使用一个numpy数组而不是一个列表。

    ZZU1


< >其他方式:

ZZU1

一般来说,记住,虽然EDOCX1是一个现成的函数,但是列表理解是一个通用的,因此非常强大的解决方案。没有什么可以阻止您在python中编写EDOCX1函数,并在以后根据需要使用它。即。:

ZZU1

注意,我在这里使用列表来模拟matlab。使用生成器和迭代器会更像Python。


对我来说,它工作得很好:

ZZU1—8


也许另一个问题是,"一旦你得到这些指数,你会怎么处理它们?"如果要使用它们来创建另一个列表,那么在Python中,它们是不必要的中间步骤。如果您想要所有与给定条件匹配的值,只需使用内置过滤器:

ZZU1

或者编写自己的列表压缩:

ZZU1

如果你想把它们从列表中删除,那么pythonic的方法不一定是从列表中删除,而是写一个列表理解,就像你正在创建一个新的列表一样,并使用左侧的EDOCX1-2重新分配:

ZZU1—4

Matlab提供EDOCX1,因为它的以数组为中心的模型通过使用数组索引选择项来工作。当然,您可以在Python中这样做,但更多的方法是使用迭代器和生成器,正如@elibendersky已经提到的那样。


即使这是一个很晚的答案:我认为这仍然是一个很好的问题,而imho python(没有额外的库或numpy这样的工具包)仍然缺乏一种方便的方法来根据手动定义的过滤器访问列表元素的索引。

您可以手动定义一个函数,该函数提供以下功能:

ZZU1

收益率:(0, 4)

在我的想象中,完美的方法是创建列表的子类,并添加索引函数作为类方法。这样,只需要过滤方法:

ZZU1

我在这里详细阐述了这个主题:网址:http://tinyurl.com