n = int(raw_input())
s = raw_input().strip().split(' ')
ar = index = [0]*n; done = [False]*n
for a in range(n): ar[a] = int(s[a])
k=0
for a in range(5):
m = 1000000001
for i in range(n):
if done[i]: continue
if ar[i] < m: m = ar[i]
if m == 1000000001:
sys.stdout.write('-1\n')
break
#print m
for i in range(n):
if ar[i] == m:
index[k] = i
k+=1
done[i]=True
print index
算法非常简单。 ar 是 n (&gt; = 5)个整数的数组。我打算在索引中存储数组前5个最小整数的0位置。
以 n 作为输入后, n 空格分隔的整数将输入到下一行。
问题非常奇怪 - 对于以下输入:
7
6 17 5 3 13 8 10
当我在代码中取消注释#print m
时,会打印3 3 0 3 0
(预期输出为3 5 6 8 10
);此外,发生了IndexError
(这只是真实问题的症状)。
变量已完成正在按预期工作(它包含一个布尔值列表,如果done[i]
为True
,则不应采用ar[i]
在寻找min(ar)
我通过在不同位置打印变量值进行了大量调试,但无法推理出任何内容。
答案 0 :(得分:4)
我不是真的关注你的代码,但是这个:
ar = index = [0]*n
在python中看起来很奇怪,尝试将其替换为:
ar = [0]*n
index = [0]*n
看看它是否有效。
这个例子可能有助于了解为什么这看起来很奇怪:
>>> a = b = [0] * 5
>>> a
[0, 0, 0, 0, 0]
>>> b
[0, 0, 0, 0, 0]
>>> a[1] = 2
>>> a
[0, 2, 0, 0, 0]
>>> b
[0, 2, 0, 0, 0]
您可能有兴趣在Other languages have "variables", Python has "names"点击。
旁注:
尝试让您的代码更具可读性:
;
另外(如果我理解你要做的事情),你的代码可以重写为:
s = raw_input().strip().split(' ')
ar = [(int(num),i) for i,num in enumerate(s)]
ar.sort()
print [a[1] for a in ar[:5]]
答案 1 :(得分:2)
ar = index = [0]*n
应为ar = [0] * n; index = [5] * 5
。
你写它的方式,ar和索引是相同的列表。
更多的pythonic将是
from heapq import nsmallest
s = map(int, raw_input().split())
print [ind for value, ind in nsmallest(5, enumerate(s), key=lambda x: x[1])]
为您的输入提供[3, 5, 6, 8, 10]
(无需明确指定n。)
答案 2 :(得分:2)
如果你学习并使用python提供的更高级别的强大功能,你会遇到很多麻烦。更少的代码更容易理解和调试:
>>> s=[6,17,5,3,13,8,10]
>>> d=dict(enumerate(s))
>>> sd=sorted(d, cmp=lambda x,y: cmp(d[x], d[y]))
>>> [d[sd[v]] for v in range(5)]
[3, 5, 6, 8, 10]