被这个代码整吐了
萌新又来求助啦,大佬们帮忙看看这串代码到底哪里出问题了,为什么同时有两个都过1/3了,输出的却只有张三呢?#建立投票程序,用户输入候选人:
p = ['张三']
m = "请输入候选人: "
m += "请输入'p'结束程序: "
active = True
while active:
mess = input(m)
if mess == 'p':
active = False
else:
p.append(mess)
#判断是否有两个候选人都超过总数的1/3:
moj_1 = moj_2 = p #初始化两个候选人变量
count_1 = count_2 = 0 #初始化两个候选人的票数
#对抗阶段:
#遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
for each in p:
if moj_1 == each:
count_1 += 1
continue
if moj_2 == each:
count_2 += 1
continue
if count_1 == 0:
moj_1 = each
count_1 = 1
continue
if count_2 == 0:
moj_2 == each
count_2 = 1
continue
count_1 -= 1
count_2 -= 1
#统计阶段:
#对抗阶段结束后,如果moj_1,moj_2两个变量都有剩余,则统计各自的票数,否则不存在同时过1/3的两个候选人:
if p.count(moj_1) > len(p) / 3:
print("候选人",moj_1,"的选票超过1/3!")
if p.count(moj_2) > len(p) / 3:
print("候选人",moj_2,"的选票超过1/3!") 请输入候选人: 请输入'p'结束程序: 张三
请输入候选人: 请输入'p'结束程序: 张三
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: p
候选人 张三 的选票超过1/3!
候选人 张三 的选票超过1/3!
这个是 我的测试结果,真的整吐了{:5_96:} 本帖最后由 0HB 于 2021-9-3 02:49 编辑
if count_2 == 0:
moj_2 = each# 赋值操作,只要一个=
#对抗阶段:
#遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
for each in p:
if moj_1 == each:
count_1 += 1
continue
if moj_2 == each:
count_2 += 1
continue
if count_1 == 0:
moj_1 = each
count_1 = 1
continue
if count_2 == 0:
moj_2 = each# 赋值操作,只要一个=
count_2 = 1
continue
count_1 -= 1
count_2 -= 1 本帖最后由 0HB 于 2021-9-3 02:28 编辑
if count_2 == 0:
moj_2 == each
count_2 = 1
continue
1.改错。代码运行的逻辑没有问题,问题在于 ‘moj_2 == each’ (判断是否值相等)没有起到把变量moj_2 赋值为 第二位候选人名字的作用。
2.分析。而为什么程序没报错,因为相当于你在这个if中写了个“False”,像是声明了个变量,但却完全没用上(你把 ‘moj_2 == each’直接改成 False写上去,效果一样的)
3.建议。使用IDE(如PyCharm)来写、运行程序,一来效率高,二来容易看出粗心所致的错误
本帖最后由 0HB 于 2021-9-3 02:53 编辑
检察 原先错误程序 运行
# 建立投票程序,用户输入候选人:
p = ['张三']
m = "请输入候选人: "
m += "请输入'p'结束程序: "
active = True
while active:
mess = input(m)
if mess == 'p':
active = False
else:
p.append(mess)
# 判断是否有两个候选人都超过总数的1/3:
moj_1 = moj_2 = p# 初始化两个候选人变量
count_1 = count_2 = 0# 初始化两个候选人的票数
# 对抗阶段:
# 遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
num = 0# 用来记录循环次数
for each in p:
if moj_1 == each:
count_1 += 1
num += 1
print('第{0}次循环,执行的是: if moj_1 == each:'.format(num))
print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
continue
if moj_2 == each:
count_2 += 1
num += 1
print('第{0}次循环,执行的是:if moj_2 == each:'.format(num))
print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
continue
if count_1 == 0:
moj_1 = each
count_1 = 1
num += 1
print('第{0}次循环,执行的是:if count_1 == 0:'.format(num))
print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
continue
if count_2 == 0:
num += 1
moj_2 == each
count_2 = 1
print('第{0}次循环,执行的是:count_2 == 0'.format(num))
print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
continue
count_1 -= 1
count_2 -= 1
num += 1
print('第{0}次循环,执行的是:减票操作'.format(num))
print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
# 统计阶段:
# 对抗阶段结束后,如果moj_1,moj_2两个变量都有剩余,则统计各自的票数,否则不存在同时过1/3的两个候选人:
if p.count(moj_1) > len(p) / 3:
print("候选人", moj_1, "的选票超过1/3!")
if p.count(moj_2) > len(p) / 3:
print("候选人", moj_2, "的选票超过1/3!")
"""
注意:第一次循环的对象是p列表中提前写好的张三
"""
结果:(按照「张三、张三、李四、李四、李四、p」依次输入) 0HB 发表于 2021-9-3 02:43
检察 原先错误程序 运行
结果:(按照「张三、张三、李四、李四、李四、p」依次输入)
哈哈,辛苦大佬了,太棒了,{:5_95:} 确实如上所述,把第四个 if 中 moj_2 == each 应该是笔误,改为 = 就好了。
另外提供另一个思路:先用 set(p) 获取候选人集合,再用 p.count(候选人)
blahblahfc 发表于 2021-9-3 08:51
确实如上所述,把第四个 if 中 moj_2 == each 应该是笔误,改为 = 就好了。
另外提供另一个思路:先用 set ...
哈哈,谢谢大佬,不过我现在还么学那么多,才刚刚学了列表这里{:5_91:}
页:
[1]