在python列表中按升序排列
作为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
,消除了错误,但没有对列表进行排序
检查:http://faculty.cs.niu.edu/~hutchins/csci241/sorting.htm
蟒蛇冒泡排序:
sample=[23,44,12,1,6,87]
sorted = False
while not sorted:
sorted = True
for i in range(len(sample) - 1):
if sample[i] > sample[i+1]:
sorted = False
sample[i], sample[i+1] = sample[i+1], sample[i]
print sample
从这里改变:Bubble Sort Homework
thanks onatm appreciate .. – jwesonga
len(t)
被引用的代码之外的东西你发布了。你想
for i in range(0,len(sample)-1):
此外,上述声明将递增i
你,没有必要为i += 1
声明。 Python也会为你处理i
的初始化,所以i = 0
语句也是不必要的。这些修复后,你会发现你的排序仍然不正确,但你可能会找到更好的途径去发现原因。
thanks..changed the code..still not working – jwesonga
我不是太熟悉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]:
希望这会有所帮助。
这不是唯一的问题,这将解决即时错误,但不会解决算法,因为它不会排序,检查我的答案更详细的信息:) – Trufa
我希望你明白为什么你的索引超出范围错误。
这是一个问题,但现在让我们来检查一下你的代码,因为你有一些“概念性”的错误,因为你并不完全理解你所做的代码。
这是你的代码实际上做了,这是当你得到这样的错误,你应该怎么想的:
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很好地说明了算法是如何工作到排序列表的。
祝你好运,并请评论,如果您有任何疑问。
快速谷歌搜索将产生许多可能的排序算法。我建议你从那里开始。至少,你的教科书中至少应该有一个。 –
更改范围(0,len(sample))中的i:'to范围内的i(0,len(sample)-1):'。现在你只需要修复你的算法。 –
什么史蒂文说+你的交换逻辑与温度也是错误的,温度永远不会在你的代码中= =的左手边 –