使用嵌套for循环排序比较列表时触发KeyError: '14454'求助
问题分析与解决方案
我来帮你拆解一下代码里的问题,顺便把逻辑理顺:
1. KeyError: '14454'的直接原因
你在第二层循环里写了y in range(l),然后访问lista[str(y+1)]。当y循环到l-1时,y+1等于l,但你的lista的键是从'0'到str(l-1)的字符串(因为只有符合条件时l才会+1,最终l是字典的元素总数),所以str(l)这个键根本不存在,自然触发KeyError。
2. 代码里的其他逻辑问题
除了KeyError,你的代码还有几个核心逻辑错误:
sorted(lista[str(x)])只是返回排序后的列表,但没有把结果赋值回去,原列表完全没被修改,等于白排序了。- 比较条件
lista[str(x)] == [str(y+1)]完全不符合需求——你应该是想比较两个排序后的三元组是否相等吧?现在这个条件是在把数值列表和一个仅含字符串的列表做比较,完全不对。 - 用字典存储三元组纯属多余,直接用列表存储更直观,不需要来回转换字符串索引。
- 手动操作
sys.stdout并close不够安全,用with open(...)语句可以自动管理文件生命周期。
修正后的代码
u = 0 triples = [] # 收集符合条件的三元组 for i in range(1, 28): for j in range(1, 28): for k in range(1, 28): a, b, c = float(i), float(j), float(k) q = (a*b*c) / ((a+b+c)**3) if 1/81 < q < 1: if a != b and b != c and c != a: triples.append([a, b, c]) # 统计排序后重复的三元组 total = len(triples) for x in range(total): sorted_x = sorted(triples[x]) # 从x+1开始循环,避免重复计数(比如x=0&y=1和x=1&y=0不会重复算) for y in range(x+1, total): sorted_y = sorted(triples[y]) if sorted_x == sorted_y: u += 1 # 写入结果到文件,自动管理文件关闭 with open("1.txt", "w") as f: print(u, file=f)
改动说明
- 用列表
triples存储三元组,直接通过索引访问,彻底避免了字符串键带来的KeyError。 - 排序后把结果存到变量里再比较,确保用的是排序后的内容。
- 内层循环从
x+1开始,避免重复统计同一对三元组,减少不必要的计算。 - 用
with open语句自动处理文件关闭,更安全可靠。 - 简化了公式写法,
(a+b+c)**3比重复写三次更简洁。
内容的提问来源于stack exchange,提问作者modoxes
相关产品推荐
相关产品推荐

