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

时间:2012-02-06 11:39:51

标签: python error-handling

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)

时考虑到这一点

我通过在不同位置打印变量值进行了大量调试,但无法推理出任何内容。

3 个答案:

答案 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"点击。

旁注:

尝试让您的代码更具可读性:

  • 在需要时转到新行,实际上不需要;
  • 不要在一行中写出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]]

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