Python字典迭代报错:'list'对象无'items'属性,如何解决?
问题分析与解决办法
嘿,我来帮你拆解下这个问题!
为什么字典会变成列表?
你代码里的map = sorted(map)是关键坑点——当你把字典传入sorted()函数时,它默认只会提取字典的键,返回一个由键组成的列表。这就导致原本存储键值对的字典变量map被覆盖成了普通列表,后面再调用map.items()(或者map.items)自然会报错,因为列表根本没有items这个属性呀!
怎么解决这个问题?
首先要明确你想要的排序目标:是对字典的键值对按距离排序,对吧?那你需要让sorted()返回排序后的键值对集合,而不是单纯的键列表。另外还要注意一个隐藏问题:字典的键是唯一的,如果数组里有两个元素到x的距离相同,后面的元素会直接覆盖前面的,这会导致数据丢失,可能不符合你找“第三远”的需求。
下面给你两种修正方案:
方案1:改用列表存储(距离, 元素)元组(推荐)
这种方式不会丢失重复距离的元素,更适合你的需求:
def thirdfarthestdistance(arr, x): # 用列表存储每个元素的(距离, 元素)元组 distance_pairs = [] for elem in arr: dist = abs(elem - x) distance_pairs.append((dist, elem)) # 按距离升序排序,如果要找最远的可以加reverse=True sorted_pairs = sorted(distance_pairs, key=lambda item: item[0]) count = 0 for dist, elem in sorted_pairs: print(elem) count += 1 if count == 3: return elem
方案2:保留字典但处理重复键
如果一定要用字典,可以把字典的值设为列表,存储相同距离的所有元素:
def thirdfarthestdistance(arr, x): dist_map = {} for elem in arr: dist = abs(elem - x) # 距离不存在就创建空列表,存在就追加元素 if dist not in dist_map: dist_map[dist] = [] dist_map[dist].append(elem) # 对距离(字典的键)进行排序 sorted_dists = sorted(dist_map.keys()) count = 0 # 先遍历排序后的距离,再遍历每个距离对应的元素 for dist in sorted_dists: for elem in dist_map[dist]: print(elem) count += 1 if count == 3: return elem
额外提醒
你之前写的map.items是错误的写法,即使是字典也需要加括号map.items()才能返回键值对迭代器,但因为前面的sorted已经把字典变成了列表,所以不管加不加括号都会报错哦。
内容的提问来源于stack exchange,提问作者merry-go-round
相关产品推荐
相关产品推荐

