繁体   English   中英

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

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

该算法非常简单。 arn (> = 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具有“名称”

边注:

尝试使代码更具可读性:

  • 在需要时转到新的一行,实际上并不需要;
  • 不要在一行中编写for循环/ if语句:对此有一个列表理解。

另外(如果我了解您要执行的操作),则可以将代码重写为:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM