我有任何值的数组,通常是相同的,我试图找到最小的索引。但我想知道所有相同的对象。
所以例如我有数组a = [1, 2, 3, 4]
并找到我使用a.index(min(a))
的最小的索引,这将返回0.但如果我有一个a = [1, 1, 1, 1]
数组,则使用同样的事情仍会返回0。
我想知道多个索引与我要搜索的内容匹配以及这些索引是什么。我该怎么做呢?
答案 0 :(得分:5)
list.index(value)
返回value
中list
的第一次出现的索引。
更好的想法是使用简单的列表理解和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)]
代码非常简单我认为这里都清楚,没有任何解释。