作为python作业的一部分,我试图在不使用 sort()方法的情况下实现列表排序(升序),我认为我的逻辑是正确的,但我一直收到错误:
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
这一直给我一个列表:索引超出范围错误我知道这是因为当i == 3时代码仍然是i + 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
消除错误但不对列表进行排序
答案 0 :(得分:1)
检查一下:http://faculty.cs.niu.edu/~hutchins/csci241/sorting.htm
python bubble sorting:
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
答案 1 :(得分: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交换44。
但是列表现在为[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很好地说明了算法如何按照排序列表的方式运行。
祝你好运,如果您有任何疑问,请发表评论。
答案 2 :(得分:0)
len(t)
引用了您发布的代码之外的内容。你想要
for i in range(0,len(sample)-1):
此外,上述语句将为您增加i
,不需要i += 1
语句。 Python也将为您处理i
的初始化,因此同样不需要i = 0
语句。修复这些问题后,您会发现排序仍然不正确,但您可能会找到更好的途径来发现原因。
答案 3 :(得分: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]:
希望这有帮助。