[英]What's wrong with this simple python code?
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 (> = 5)个整数的数组。 我打算将数组的前5个最小整数的从0开始的位置存储在index中 。
以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
,则在查找min(ar)
时不应考虑ar[i]
我通过在不同位置打印变量的值进行了很多调试,但是什么也做不出来。
我并不是真的遵循您的代码,但这是:
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]
您可能会对以下内容感兴趣: 其他语言具有“变量”,Python具有“名称” 。
边注:
尝试使代码更具可读性:
;
另外(如果我了解您要执行的操作),则可以将代码重写为:
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]]
ar = index = [0]*n
应该是ar = [0] * n; index = [5] * 5
ar = [0] * n; index = [5] * 5
。 您编写它的方式,ar和index 是相同的列表 。
多一些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)。
如果您学习并使用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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.