2011-10-10 135 views
1

作为python任务的一部分,我试图在不使用sort()方法的情况下实现列表排序(升序),我认为我的逻辑是正确的,但我一直收到错误:在python列表中按升序排列

sample=[23,44,12,1,6,87] 
temp=0 
for i in range(0,len(sample)): 
    if sample[i] > sample[i+1]: 
     sample[i]=temp 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

这一直给我一个列表:指数超出范围错误我知道正在被事实所造成的,当我== 3中的代码仍然做我+ 1。

需要这方面的帮助..

我改变了代码:

for i in range(0,len(sample)-1): 
    if sample[i] > sample[i+1]: 
     temp=sample[i] 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

,消除了错误,但没有对列表进行排序

+1

快速谷歌搜索将产生许多可能的排序算法。我建议你从那里开始。至少,你的教科书中至少应该有一个。 –

+2

更改范围(0,len(sample))中的i:'to范围内的i(0,len(sample)-1):'。现在你只需要修复你的算法。 –

+1

什么史蒂文说+你的交换逻辑与温度也是错误的,温度永远不会在你的代码中= =的左手边 –

回答

0

len(t)被引用的代码之外的东西你发布了。你想

for i in range(0,len(sample)-1): 

此外,上述声明将递增i你,没有必要为i += 1声明。 Python也会为你处理i的初始化,所以i = 0语句也是不必要的。这些修复后,你会发现你的排序仍然不正确,但你可能会找到更好的途径去发现原因。

+0

thanks..changed the code..still not working – jwesonga

0

我不是太熟悉Python,但我相信,当你这样做的:

for i in range(0,len(sample)): 
    if sample[i] > sample[i+1]: 

我会尝试将其更改为:

for i in range(0,len(sample) - 1): 
    if sample[i] > sample[i+1]: 

希望这会有所帮助。

+0

这不是唯一的问题,这将解决即时错误,但不会解决算法,因为它不会排序,检查我的答案更详细的信息:) – Trufa

1

我希望你明白为什么你的索引超出范围错误。

这是一个问题,但现在让我们来检查一下你的代码,因为你有一些“概念性”的错误,因为你并不完全理解你所做的代码。

这是你的代码实际上做了,这是当你得到这样的错误,你应该怎么想的:

sample=[23,44,12,1,6,87] 
temp=0 


for i in range(0,len(sample)-1): 
    if sample[i] > sample[i+1]: 
     temp=sample[i] 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

第一行: 你i将得到的值0,1,2至5 (在这种情况下)。

第二行: 它将检查是否对列表的成员彼此相邻

它会检查第一个(从左到右)是否大于第二个,它会检查23> 44,这将是错误的,所以它不会执行其余的代码。

i将为1,因此您将检查44> 12,这是真实的,因此您的代码将执行并成功交换这两个。

这是学习在python中交换变量而不使用临时变量的流畅方式的好时机。

sample[i], sample[i+1] = sample[i+1], sample[i] 

查看更多关于它,谷歌python变量交换,如果你想。

回复原始问题。

您已成功交换44和12,此列表代表[23,12,44,1,6,87]

但是,如果你继续这样做,它会:

交换44 1

交换44与6

不会掉44与87

不过这个名单现在将[23,12,1,6,44,87]并且您的代码将停止执​​行,因为i现在是5.

您是否发现了问题?

您需要重新运行几次才能实际订购它,因为它不检查列表是否已组织,而是交换彼此相邻的成员。

所以,如果你(此特定列表)运行:

for j in range(3): 
    for i in range(0,len(sample)-1): 
     if sample[i] > sample[i+1]: 
      sample[i], sample[i+1] =sample[i+1], sample[i] 

名单将订购。

排序像列表这样的有序集合是一个很多研究“领域”。

我建议你阅读排序算法,从非常简单的排序算法开始,如泡沫排序,因为这是你的算法(如onatm建议)。

有一些“有趣”的方法来学习这种算法,例如,check this out

如果您有兴趣,也可以在this上阅读。

This site很好地说明了算法是如何工作到排序列表的。

祝你好运,并请评论,如果您有任何疑问。