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,如果你原本想保留所有出现过的索引,或者第一次出现的索引,那自然就会觉得“失效”了。
接下来根据你的需求,给你几种不同的解决方案:
- 如果只需要每个值最后一次出现的索引:那你的代码其实完全正确,只是可能和你预期的行为不符而已,不需要修改。
- 如果需要每个值第一次出现的索引:可以改用普通循环,只在键不存在时赋值,避免覆盖:
这样对于你的例子,73对应的就是第一次出现的索引0了。idx = {} for i, n in enumerate(x): if n not in idx: idx[n] = i - 如果需要每个值对应的所有索引列表:这时候需要把键对应的值改成列表,收集所有出现过的索引,推荐用
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
相关产品推荐
相关产品推荐

