鱼C论坛

 找回密码
 立即注册
查看: 74|回复: 3

[已解决]python第21讲课后动动手

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

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

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

x
s
[2, 2, 4, 2, 3, 6, 2]
>>> s.sort()
>>> s
[2, 2, 2, 2, 3, 4, 6]
>>> for i in s:
        if i ==s[len(s)//2]:
                print("存在主要元素,是:",i)
                break
        else:
                continue
else:
        print("不存在主要元素")
我这样成功了是凑巧还是逻辑上是正确的
最佳答案
3 天前
本帖最后由 jackz007 于 2025-3-31 17:59 编辑

        楼主的成功纯属巧合,所谓主要元素的定义是,其数量(个数)必须占到列表元素数量的一半以上。而楼主的代码,任意给出一个列表,都会给出 "存在主要元素" 的判断,因为这个判断:
for i in s:
    if i == s[len(s) // 2]
        只要枚举到列表索引一半的位置,这个判断铁定成立,不信,你可以用 s = [1 , 2 , 3 , 4 , 5 , 6 , 7] 来进行测试。
s = [1,2,3,4,5,6,7]
s . sort()
for i in s :
    if  i == s[len(s) // 2] :
        print('存在主要元素:' , s[len(s) // 2])
        break
else:
    print('不存在主要元素')
        正确的代码应该是:
s = [2, 2, 4, 2, 3, 6, 2]
s . sort()
if s . count(s[len(s) // 2]) >= len(s) // 2 :      # 经过排序后,如果存在主元素,则一定会在出现在列表索引居中的位置,只要统计列表中这个元素的数量即可以进行判定。
    print('存在主要元素:' , s[len(s) // 2])
else:
    print('不存在主要元素')
        如你所见,根本用不着循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
关于你写的判断“主要元素”的代码逻辑分析

你写的代码如下:
s.sort()
for i in s:
    if i == s:
        print("存在主要元素,是:", i)
        break
    else:
        continue
else:
    print("不存在主要元素")

[b]结论:你的代码能“成功”是凑巧,不是逻辑正确。[/b]

原因分析如下:

  • i == s 这个条件永远不会成立,因为 i 是列表中的一个元素,而 s 是整个列表,它们类型不同,值也不同。
  • 所以 if i == s 这个判断永远是 False,除非你把整个列表 s 中的某个元素也设成了整个列表本身(比如 s.append(s)),这就是你说的“凑巧”。
  • “主要元素”通常是指在一个列表中出现次数超过一半的元素。你现在的代码并没有统计每个元素出现的次数,所以逻辑上是错误的。


正确的做法应该是:

比如我们可以用一个字典统计每个元素出现的次数:
s = [1, 2, 3, 2, 2, 2, 5]
count = {}
for i in s:
    count[i] = count.get(i, 0) + 1

for k, v in count.items():
    if v > len(s) // 2:
        print("存在主要元素,是:", k)
        break
else:
    print("不存在主要元素")

这样才是逻辑上正确的判断“主要元素”的方法。

如果你还有其他问题,欢迎继续提问~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-3-31 17:59 编辑

        楼主的成功纯属巧合,所谓主要元素的定义是,其数量(个数)必须占到列表元素数量的一半以上。而楼主的代码,任意给出一个列表,都会给出 "存在主要元素" 的判断,因为这个判断:
for i in s:
    if i == s[len(s) // 2]
        只要枚举到列表索引一半的位置,这个判断铁定成立,不信,你可以用 s = [1 , 2 , 3 , 4 , 5 , 6 , 7] 来进行测试。
s = [1,2,3,4,5,6,7]
s . sort()
for i in s :
    if  i == s[len(s) // 2] :
        print('存在主要元素:' , s[len(s) // 2])
        break
else:
    print('不存在主要元素')
        正确的代码应该是:
s = [2, 2, 4, 2, 3, 6, 2]
s . sort()
if s . count(s[len(s) // 2]) >= len(s) // 2 :      # 经过排序后,如果存在主元素,则一定会在出现在列表索引居中的位置,只要统计列表中这个元素的数量即可以进行判定。
    print('存在主要元素:' , s[len(s) // 2])
else:
    print('不存在主要元素')
        如你所见,根本用不着循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 10:02 | 显示全部楼层
你这个if i ==s[len(s)//2]逻辑里面相当于if i ==s[3],s[3]是列表里第四个元素也就是2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-3 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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