Skip to main content
 首页 » 编程设计

python之这个简单的 python 代码有什么问题

2025年05月04日13虾米姐

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 按预期工作(它包含一个 bool 值列表,其中,如果 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] 

您可能有兴趣查看 Other languages have "variables", Python has "names" .

旁注:

尽量让你的代码更具可读性:

  • 需要时换行,实际上不需要;
  • 不要在一行中写 for-loops/if-statements:有列表理解。

另外(如果我明白你想做什么),你的代码可以重写为:

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]]