鱼C论坛

 找回密码
 立即注册
查看: 1308|回复: 10

[已解决]关于序列中的课后作业求支招

[复制链接]
发表于 2020-6-29 23:53:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于以下这道课后作业,老师是用判断出整型和浮点型的方法相加得到结果的
视频中我们说 sum() 这个BIF有个缺陷,就是如果参数里有字符串类型的话就会报错,请写出一个新的实现过程,自动“无视”参数里的字符串并返回正确的计算结果
def sum(x):
    result = 0
    
    for each in x:
        if (type(each) == int) or (type(each) == float):
            result += each
        else:
            continue

    return result

print(sum([1, 2.1, 2.3, 'a', '1', True]))

那我想问的是,能不能用 for each 判断出字符串类型,然后用.pop(each)把字符串减掉,这样遍历一遍后就剩整型和浮点型了,再用sum()函数。当然,这种思路是针对题目中列表只有数字和字符串,如果有多种类型还是上面的思路靠谱。
a = [1, 2, 3, "hehe", 5, 6, "xixi"]
for each in a:
    if (each==XXXXX): #这个不懂写。
        a.pop(each)
print(sum(a))
print(b)
最佳答案
2020-6-30 00:02:15




可以 不过你其实改进下,通过判断是不是数字不就行了,type(xx) == int or type(xx) == float 即可容纳其他的类型咯:
a = [1, 2, 3, "hehe", 5, 6, "xixi"]
for each in a[:]:
    if type(each) == int or type(each) == float:
        continue
    a.remove(each)

print(sum(a))

这边要注意一点  循环的要循环切片后的值,不能直接把原列表移除,这样会导致你 for 循环过程遗漏判断里面的元素

因为你移除时候列表会变短,而 for 循环还会继续往下遍历,导致遗漏判断

而且你这里 pop 用法错了 ,pop函数里面填的是位置参数哈,你应该用remove 填 each 才算正确的




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-30 00:02:15 | 显示全部楼层    本楼为最佳答案   




可以 不过你其实改进下,通过判断是不是数字不就行了,type(xx) == int or type(xx) == float 即可容纳其他的类型咯:
a = [1, 2, 3, "hehe", 5, 6, "xixi"]
for each in a[:]:
    if type(each) == int or type(each) == float:
        continue
    a.remove(each)

print(sum(a))

这边要注意一点  循环的要循环切片后的值,不能直接把原列表移除,这样会导致你 for 循环过程遗漏判断里面的元素

因为你移除时候列表会变短,而 for 循环还会继续往下遍历,导致遗漏判断

而且你这里 pop 用法错了 ,pop函数里面填的是位置参数哈,你应该用remove 填 each 才算正确的




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:10:20 | 显示全部楼层
Twilight6 发表于 2020-6-30 00:02
可以 不过你其实改进下,通过判断是不是数字不就行了,type(xx) == int or type(xx) == float 即可 ...

受教了,感谢。
意思是做减法的话,第一个减了之后后面几个元素的index会变是吧。
a = [1, 2, 3, "hehe", 5, 6, "xixi"]
for each in a[:]:
    if type(each)==str:
        a.remove(each)
print(a)

这样子好像减掉的也是只有字符串啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:13:10 | 显示全部楼层
本帖最后由 lamupen 于 2020-6-30 00:16 编辑
Twilight6 发表于 2020-6-30 00:02
可以 不过你其实改进下,通过判断是不是数字不就行了,type(xx) == int or type(xx) == float 即可 ...

a = [1, 2, 3, "hehe", 5, 6, "xixi"]
for each in a[:]:
    if type(each) ==str:
   # a=a.remove(each)   这样赋值能让for循环遍历切片后的值吗? 我试了下报错了 
    a.remove(each)       #直接执行这句好像是能把字符串都切了,没漏元素呀。。
print(sum(a))

如果要做减法,大佬有啥方法让for循环遍历切片后的列表啊,我上面直接remove遍历时会漏元素吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 00:17:38 | 显示全部楼层
lamupen 发表于 2020-6-30 00:10
受教了,感谢。
意思是做减法的话,第一个减了之后后面几个元素的index会变是吧。

[b]

意思是做减法的话,第一个减了之后后面几个元素的index会变是吧。

对的  后面的index 都会向前移动

这样子好像减掉的也是只有字符串啊。

你这样判断当然只弄掉字符串哈


#这样赋值能让for循环遍历切片后的值吗?

你这里少了个缩进,会报错,而且列表的绝大多数方法是没用返回值的 默认返回 None 所以不能拿去赋值

pop 有返回值 记着就好[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:21:01 | 显示全部楼层
大佬,需求如果变成一个列表,里面啥都有,现在我想把str类型的去掉,就只能做减法了吧。
怎么使用for each 和remove()才能做到“循环的要循环切片后的值,不能直接把原列表移除,这样会导致你 for 循环过程遗漏判断里面的元素”
我卡在这了,没想通。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:30:04 | 显示全部楼层
Twilight6 发表于 2020-6-30 00:17
对的  后面的index 都会向前移动

你这样判断当然只弄掉字符串哈

大佬,我好像整明白了

a=[1,2,3,"hehe",5,6,"xixi"]
     0,1,2,  3,      4,5, 6            index

如果我用for each in a 和 ==str 以及remove(),这里for each 虽然减了hehe和xixi  但是for循环是有完整遍历0到6的是吗?
只不过生成的a变成了[1,2,3,5,6],对应的5和6的index值在a里变成了3和4?

还是说执行for each 的过程中,each是3的时候先减掉了hehe,所以5的index就从4变成了3,6变成了4,xixi变成了5,然后each接着递增所以能把xixi给减了。
如果我这里的例子变成a=[1,2,3,"hehe","xixi",5,6],那么xixi就会被漏判,是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:34:55 | 显示全部楼层
lamupen 发表于 2020-6-30 00:30
大佬,我好像整明白了

a=[1,2,3,"hehe",5,6,"xixi"]
a = [1, 2, 3, "hehe","loupan", 5, 6, "xixi"]
for each in a[:]:
    if type(each)==str:
        a.remove(each)
print(a)

我测试了下,index为3的hehe被删了,那loupan的index从4变成了3,for each 循环中each为3是执行过减去hehe的操作了下一步each。。。。。。



写到这我忽然顿悟,我傻逼了,each是元素值,不是index。我跟其他语言混了。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:38:33 | 显示全部楼层
本题中
“这边要注意一点  循环的要循环切片后的值,不能直接把原列表移除,这样会导致你 for 循环过程遗漏判断里面的元素”

哪个大哥能举个例子教一下,没能理解这个。
哪个大哥写个漏判的例子我琢磨下,感激不尽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-30 00:50:32 From FishC Mobile | 显示全部楼层
我琢磨了下,做减法for each in a是不是不会发生漏判,得for each in range(len(a)) 这种each是index值的才会,明天我上机测试下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 07:45:26 | 显示全部楼层
lamupen 发表于 2020-6-30 00:50
我琢磨了下,做减法for each in a是不是不会发生漏判,得for each in range(len(a)) 这种each是index值的才 ...

那你太粗心了哈,你随便试试这个代码就知道会不会了:
a = [1, 2, 3, "hehe",'','', 5, 6, "xixi"]
for each in a:
    if type(each) == int or type(each) == float:
        continue
    a.remove(each)

print(sum(a))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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