Python字典赋值异常:如何让dict[0]输出'med'而非'No'?
修复Python字典赋值被覆盖的问题
嘿,我一眼就瞅出问题所在啦!你的内层循环在遍历mm里的元素时,每次循环都会重新给dico[i]赋值,哪怕之前已经匹配到正确的值了,最后一次不匹配的循环会把之前的结果覆盖掉。
举个例子:当处理listo[0]也就是'med'时,第一次x = 'med',匹配成功,dico[0]被设为'med';但紧接着x变成'holy',这时候'holy'不在'med'里,代码就把dico[0]改成了'No'——这就是为啥你得到的结果里dict[0]是'No'而不是期望的'med'。
下面给你两种修复方案,任选其一都能解决问题:
方案一:先设默认值,找到匹配就停止内层循环
这种方法逻辑直观,先给每个位置默认赋值'No',一旦找到匹配项就更新值并跳出内层循环,避免被后续不匹配的元素覆盖:
dico = {} listo = ['med', 'lam', 'rih', 'holy', 'lem'] mm = ['med', 'holy'] for i, v in enumerate(listo): dico[i] = 'No' # 先设置默认值 for x in mm: if x in v: dico[i] = x break # 找到匹配就立刻停止内层循环,防止被覆盖
方案二:用next()简化逻辑
利用Python的next()函数结合生成器表达式,直接取第一个匹配的元素,没有匹配项时返回默认值'No',代码更简洁:
dico = {} listo = ['med', 'lam', 'rih', 'holy', 'lem'] mm = ['med', 'holy'] for i, v in enumerate(listo): # 遍历mm,返回第一个匹配的x;如果没有匹配,返回'No' match = next((x for x in mm if x in v), 'No') dico[i] = match
运行上面任意一段代码,你都会得到期望的结果:{0: 'med', 1: 'No', 2: 'No', 3: 'holy', 4: 'No'}
内容的提问来源于stack exchange,提问作者Mohamed Hachaichi
相关产品推荐
相关产品推荐

