如何判断多个索引何时匹配?

时间:2015-02-04 20:09:27

标签: python arrays

我有任何值的数组,通常是相同的,我试图找到最小的索引。但我想知道所有相同的对象。

所以例如我有数组a = [1, 2, 3, 4]并找到我使用a.index(min(a))的最小的索引,这将返回0.但如果我有一个a = [1, 1, 1, 1]数组,则使用同样的事情仍会返回0。

我想知道多个索引与我要搜索的内容匹配以及这些索引是什么。我该怎么做呢?

3 个答案:

答案 0 :(得分:5)

list.index(value)返回valuelist第一次出现的索引。

更好的想法是使用简单的列表理解和enumerate

indices = [i for i, x in enumerate(iterable) if x == v]

其中v是您要搜索的值,iterable是支持迭代器协议的对象,例如它可以是生成器或序列(如list)。

对于您的特定用例,它看起来像

def smallest(seq):
    m = min(seq)
    return [i for i, x in enumerate(seq) if x == m]

一些例子:

In [23]: smallest([1, 2, 3, 4])
Out[23]: [0]

In [24]: smallest([1, 1, 1, 1])
Out[24]: [0, 1, 2, 3]

如果您不确定seq是否为空,则可以将default=-1(或其他一些值)参数传递给min函数(在Python 3.4中) +):

m = min(seq, default=-1)

在使用较旧的Python时,请考虑使用m = min(seq or (-1,))(同样,任何值)。

答案 1 :(得分:1)

使用numpy.where的不同方法可能看起来像

In [1]: import numpy as np
In [2]: def np_smallest(seq):
   ...:     return np.where(seq==seq.min())[0]

In [3]: np_smallest(np.array([1,1,1,1]))
Out[3]: array([0, 1, 2, 3])

In [4]: np_smallest(np.array([1,2,3,4]))
Out[4]: array([0])

这种方法比小列表的列表理解效率低,但是如果你面对大型数组,numpy可能会节省你一些时间。

In [5]: seq = np.random.randint(100, size=1000)
In [6]: %timeit np_smallest(seq)
100000 loops, best of 3: 10.1 µs per loop
In [7]: %timeit smallest(seq)
1000 loops, best of 3: 194 µs per loop

答案 2 :(得分:0)

这是我的解决方案:

def all_smallest(seq):
    """Takes sequence, returns list of all smallest elements"""
    min_i = min(seq)
    amount = seq.count(min_i)
    ans = []
    if amount > 1:
        for n, i in enumerate(seq):
            if i == min_i:
                ans.append(n)
            if len(ans) == amount:
                return ans            
    return [seq.index(min_i)]

代码非常简单我认为这里都清楚,没有任何解释。