2017-11-18 140 views
1

我需要把所有从该列表中的最小元素索引:得到一个列表索引上的蟒蛇

A = [5,2,1,5,6,1,7,9,2] 


minimo = min(A) 
#print minimo 
indexArray = [] 
for elem in A: 
    #print elem 
    if elem == minimo: 
     indexArray.append(A.index(elem)) 
print indexArray 

需要这样的输出:[2,5] 但它打印:2,2 ]

+0

在重复的情况下, ,只需检查'== min(A)'。 – roganjosh

+1

'索引'只给你第一次出现。 – bhansa

+0

** index **是一个函数,它返回序列中元素的** _ first _ **索引,这就是为什么结果列表中的元素是相同数字的原因。 – 2017-11-18 12:40:32

回答

2

您可以使用list-comprehensionenumerate()。感谢@MikeScotty,性能改进将首先计算出最小值。

下面的代码:

mn = min(A) 
[i for i,e in enumerate(A) if e == mn] 

这给:

[2, 5] 

这是1sA的指标 - 不[2, 8]


为了证明这是更快,这里是minxwrapper

>>> def minx(l): 
...  print("called") 
...  return min(l) 
... 
>>> [i for i,e in enumerate(A) if e == minx(A)] 
called 
called 
called 
called 
called 
called 
called 
called 
called 
[2, 5] 

有些时限利用timeit

>>> timeit.timeit("[i for i,e in enumerate(A) if e == min(A)]", globals=locals()) 
5.9568054789997404 
>>> timeit.timeit("[i for i,e in enumerate(A) if e == 1]", globals=locals()) 
1.397674421001284 
+1

这将为每个元素调用''min'',这可以使用巨大的列表进行一些性能测试。更好地获得列表理解之外的最小元素,即使它意味着有2行而不是1 –

+0

@MikeScotty我会更新答案,但是看看Python *是否真的重新评估它会很有趣。我不确定,也无法通过谷歌找到答案,这是真的吗? –

+1

是的,如果你构建自己的''minX(L)''方法作为'min()'的封装并且打印出来,你就可以测试它 - 你会看到每次迭代都会调用它。 –

0

你可以试试这一件:

A = [5,2,1,5,6,1,7,9,2] 
minimum = min(A) 
res = list(filter(lambda m: A[m]==minimum, range(len(A)))) 
print(res) 

输出是:

[2, 5] 
+1

在语言中实现列表理解的坚实理由:) – roganjosh

+1

@roganjosh我同意列表理解比使用'filter'更具可读性。以防万一,我只是把它作为一种替代方式呈现出来。 –

0

因为当你使用

A.index(elem) 

它与A.index等于(1)和1指数将永远是2.你可以试试这个脚本:

A=[5,2,1,5,6,1,7,9,2] 
minimo = min(A) 
indexArray = [] 
for index,value in enumerate(A): 
    if value == minimo: 
     indexArray.append(index) 
print(indexArray)