You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:27