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

Python中值到索引映射字典推导式的失效原因及解决方案

Python中值到索引映射字典推导式的失效原因及解决方案

嗨,我来帮你捋清楚这个问题~

你的代码idx= { n:i for i, n in enumerate(x)}失效的核心原因很简单:字典的键是唯一的!

你看你给的输入列表x= [73,74,75,71,69,72,76,73]里,73出现了两次——第一次在索引0的位置,第二次在索引7的位置。当字典推导式遍历列表的时候,会先把73:0存入字典,但遍历到最后一个元素时,又会把73:7存进去,这就直接覆盖了之前的73:0条目。所以最终字典里73对应的索引只有最后一次出现的7,如果你原本想保留所有出现过的索引,或者第一次出现的索引,那自然就会觉得“失效”了。

接下来根据你的需求,给你几种不同的解决方案:

  • 如果只需要每个值最后一次出现的索引:那你的代码其实完全正确,只是可能和你预期的行为不符而已,不需要修改。
  • 如果需要每个值第一次出现的索引:可以改用普通循环,只在键不存在时赋值,避免覆盖:
    idx = {}
    for i, n in enumerate(x):
        if n not in idx:
            idx[n] = i
    
    这样对于你的例子,73对应的就是第一次出现的索引0了。
  • 如果需要每个值对应的所有索引列表:这时候需要把键对应的值改成列表,收集所有出现过的索引,推荐用collections.defaultdict来简化代码:
    from collections import defaultdict
    
    idx = defaultdict(list)
    for i, n in enumerate(x):
        idx[n].append(i)
    
    要是不想导入模块,也可以手动判断:
    idx = {}
    for i, n in enumerate(x):
        if n in idx:
            idx[n].append(i)
        else:
            idx[n] = [i]
    
    运行后你会得到{73: [0, 7], 74: [1], 75: [2], 71: [3], 69: [4], 72: [5], 76: [6]},所有索引都被保留下来了。

备注:内容来源于stack exchange,提问作者useDeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:42:59