鱼C论坛

 找回密码
 立即注册
查看: 2150|回复: 6

[已解决]python 插序排列问题求助

[复制链接]
发表于 2020-12-31 11:27:42 | 显示全部楼层 |阅读模式
2鱼币
各位大神,小白求助!
我在学习python的时候,有段代码看不懂,麻烦大神解惑!
题目如下:
有一个字典,其中保存着学生的成绩单:

students = { "Harry":87,"Joe":90,"Yolanda":67,"Aaron":88,"Charles":79,"Fred":93}
请将这个成绩单按照成绩的多少,从低到高排列。

标准代码如下:students = { "Harry":87,"Joe":90,"Yolanda":67,"Aaron":88,"Charles":79,"Fred":93}
sortedLists =[]

#插入排序
def insert(l,b):
    i=0
    for x in l:
        if x[1]>b[1]:
            l.insert(i,b)
            return
        i += 1
    l.append(b)

print("排序前:",students)
for k,v in students.items():
    insert(sortedLists,[k,v])
print("排序后:",sortedLists)
我的问题如下:
1.标红部分每句代码实现的目的是什么?
2.return语句在这段代码中有什么作用?
3.l,b作为两个列表参数,难道不需要在函数内部先赋值吗?

最佳答案
2020-12-31 11:27:43
for k,v in students.items():
    insert(sortedLists,[k,v])关键是这两句

是把原字典的每个键值对组成一个列表作为函数的b参数
最开始sortedLists作为函数的l参数是空的所以不会执行函数的
for x in l:
        if x[1]>b[1]:
            l.insert(i,b)
            return
直接执行最后一句sortedLists.append(b),把字典第一个键值对加进列表里

然后字典第二个键值对的值如果比第一个值小的话,就会执行if语句,在sortedLists位置0处加进第二个键值对,这个时候return就起作用了,下边的函数不再执行了,是的,函数结束了。
但是如果第二个键值对的值如果比第一个值大的话,就不会执行if语句中的内容,直接执行l.append(b),在列表的末尾加b
以此类推,每一次insert(l,b)都是把[k,v]和之前的值做对比。
v值比之前的都大就不会执行if语句,在列表的末尾加进去
v值比某个地方的小就会执行if语句,并在这个地方之前加进去(i 值控制),并且由于return控制不会执行l.append(b)

最佳答案

查看完整内容

for k,v in students.items(): insert(sortedLists,[k,v])关键是这两句 是把原字典的每个键值对组成一个列表作为函数的b参数 最开始sortedLists作为函数的l参数是空的所以不会执行函数的 for x in l: if x[1]>b[1]: l.insert(i,b) return 直接执行最后一句sortedLists.append(b),把字典第一个键值对加进列表里 然后字典第二个键值对的值如果比第一个值小的话,就会执行if语句, ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 11:27:43 | 显示全部楼层    本楼为最佳答案   
for k,v in students.items():
    insert(sortedLists,[k,v])关键是这两句

是把原字典的每个键值对组成一个列表作为函数的b参数
最开始sortedLists作为函数的l参数是空的所以不会执行函数的
for x in l:
        if x[1]>b[1]:
            l.insert(i,b)
            return
直接执行最后一句sortedLists.append(b),把字典第一个键值对加进列表里

然后字典第二个键值对的值如果比第一个值小的话,就会执行if语句,在sortedLists位置0处加进第二个键值对,这个时候return就起作用了,下边的函数不再执行了,是的,函数结束了。
但是如果第二个键值对的值如果比第一个值大的话,就不会执行if语句中的内容,直接执行l.append(b),在列表的末尾加b
以此类推,每一次insert(l,b)都是把[k,v]和之前的值做对比。
v值比之前的都大就不会执行if语句,在列表的末尾加进去
v值比某个地方的小就会执行if语句,并在这个地方之前加进去(i 值控制),并且由于return控制不会执行l.append(b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 12:25:34 | 显示全部楼层
你到不如不悬赏
最佳都有3个鱼币
还加两荣誉一技术值呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 12:44:44 | 显示全部楼层
标红部分每句代码实现的目的是排序
2.return语句在这段代码中有什么作用?结束函数
l,b作为两个列表参数,难道不需要在函数内部先赋值吗 不需要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-31 14:05:47 | 显示全部楼层
小伤口 发表于 2020-12-31 12:25
你到不如不悬赏
最佳都有3个鱼币
还加两荣誉一技术值呢

现在对规则还不是太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 16:17:55 | 显示全部楼层
1.红色部分实现sortedLists生成与排序:
def insert(l, b):  # l为一个列表其实就是sortedLists,b是存放一对key和value的列表
    i = 0
    for x in l:  # 对l进行循环
        if x[1] > b[1]:  # x[1]相当于l[i][1],把它与b[1]比较
            l.insert(i, b)  # 如果b[1]>l[i][1],就把b[1]插入到l[i][1]的位置
            print(l)
            return
        i += 1
    l.append(b)  # 如果b[1]比l中的所有的成绩都大,就把b[1]放l最后边
通过这个函数就实现了sortedLists生成与排序
2.return结束函数,因为b[1]已经插入到合适的位置,继续循环就没有意义了
3.传参就是赋值,不需要再赋值了。
这个函数语法简洁,算法上也比冒泡要优秀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-2 15:15:26 | 显示全部楼层
byfox 发表于 2020-12-31 16:17
1.红色部分实现sortedLists生成与排序:
def insert(l, b):  # l为一个列表其实就是sortedLists,b是存放 ...

感谢大神,讲得很明白,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 21:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表