zrttrz111 发表于 4 天前

python第21讲课后动动手

s

>>> s.sort()
>>> s

>>> for i in s:
        if i ==s:
                print("存在主要元素,是:",i)
                break
        else:
                continue
else:
        print("不存在主要元素")
我这样成功了是凑巧还是逻辑上是正确的

FishC 发表于 4 天前

关于你写的判断“主要元素”的代码逻辑分析

你写的代码如下:


s.sort()
for i in s:
    if i == s:
      print("存在主要元素,是:", i)
      break
    else:
      continue
else:
    print("不存在主要元素")


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

原因分析如下:


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


正确的做法应该是:

比如我们可以用一个字典统计每个元素出现的次数:


s =
count = {}
for i in s:
    count = count.get(i, 0) + 1

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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 4 天前

本帖最后由 jackz007 于 2025-3-31 17:59 编辑

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

xiaoniugogogo 发表于 3 天前

你这个if i ==s逻辑里面相当于if i ==s,s是列表里第四个元素也就是2
页: [1]
查看完整版本: python第21讲课后动动手