2012-02-06 95 views
1
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的位置。这个简单的Python代码有什么问题?

服用Ñ作为输入,Ñ空间隔开的整数之后被输入到下一行。

的问题是很奇怪的 - 为对以下输入:

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)

我做了很多的调试通过印刷在不同位置的变量值,但不能弄明白什么

回答

4

我真的不跟随你的代码,但这:

ar = index = [0]*n 

非常奇怪的蟒蛇做,尝试将其替换:

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] 

你可能有兴趣在采取loook在Other languages have "variables", Python has "names"

旁注:

尽量使你的代码更易读:

  • 去一个新的生产线需要的时候,有一个为;
  • 没有实际需要不写换循环/ 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]] 
+0

谢谢!工作!我不知道通过编写a = b = [],python只是指向与a相同的列表,b – Rushil 2012-02-06 11:55:28

+1

@Rushil:Python对象总是按引用传递,而不是按值传递。 “a = b = []”与“b = []; a = b”相同,所以你最终得到的两个变量都指向同一个对象。 – 2012-02-06 11:58:31

+0

@Ricardo:谢谢你的理解。 – 2012-02-06 12:34:57

2

ar = index = [0]*n应该ar = [0] * n; index = [5] * 5。 你写它的方式,AR和索引相同列表

有些更Python会

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明确)。

+0

感谢缩短代码。顺便说一下,index = [5] * 5将不起作用。索引的大小至少应为n(如果ar []中的整数重复) – Rushil 2012-02-06 12:06:56

+0

@Rushil:啊,这就解释了:-)你有重复,并且想要存储5个最小整数的所有位置。在这种情况下,我的答案会给出比你的其他输出。 – WolframH 2012-02-06 12:11:23

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

谢谢你。我刚刚将一段C代码片段转换为python,看看它是如何工作的:-) – Rushil 2012-02-06 12:18:15