CS50 Python:输入项显示顺序异常,如何让先输入元素优先?
问题分析与解决方案
你的代码输出顺序不符合预期,核心原因是集合(set)是无序的数据结构,遍历set(ml)时的元素顺序完全由集合内部哈希机制决定,和你输入的顺序没有关联,因此会出现先输出b再输出a的情况。
具体问题拆解
- 输入
a, b, a后,ml列表实际为['A', 'B', 'A'](因为代码里用了upper()转大写) - 调用
set(ml)去重后得到{'A', 'B'},但集合没有固定顺序,遍历时候可能先取到B,再取到A,最终输出顺序和输入的首次出现顺序相反 - 代码中在遍历集合时修改原列表
ml(执行ml.remove(i))属于多余操作,还可能引发潜在的遍历异常
修复方案
要保留输入的首次出现顺序,不能用集合去重,而是通过有序字典统计元素出现次数(Python 3.7+ 字典默认保留插入顺序),按输入的首次出现顺序输出结果:
def main(): ml = [] grocery(ml) # 用字典统计次数,同时保留元素首次出现的顺序 count_dict = {} for item in ml: count_dict[item] = count_dict.get(item, 0) + 1 # 按首次出现顺序输出统计结果 for item, cnt in count_dict.items(): print(cnt, item) def grocery(ml): while True: try: x = input("").upper().strip() if not x: continue ml.append(x) except EOFError: return ml # 原代码中的KeyError、AttributeError不会触发,直接移除 main()
修复说明
- 利用Python 3.7+字典的插入顺序特性,保证输出顺序和元素首次输入顺序一致
- 一次性统计所有元素的出现次数,避免遍历过程中修改原列表,逻辑更简洁稳定
- 移除了不必要的异常捕获,因为
input()返回字符串,upper()和strip()不会触发KeyError或AttributeError
内容的提问来源于stack exchange,提问作者rashik
相关产品推荐
相关产品推荐

