对比两个列表元素并计算中位数时遇'int不可迭代'错误求助
问题描述
我有一个关键词列表:
list1 = ['key(1)', 'key(2)', ..., 'key(x)']
还有一个二维列表:
list2 = [ ['key1','str(11)','value(11)'], ['key1','str(12)','value(12)'], ..., ['key(1)','str(1n)','value(1n)'], ['key2','str(21)','value(21)'], ..., ['key(n)','str(nn)','value(nn)'] ]
需求是:为list1中每个存在于list2里的关键词,计算其对应所有value的中位数,最终输出格式如下:
output_list=[ ['key(1)', median(value(11),...value(1n))], ['key(2)', median(value(21),...value(2n))], ..., ['key(x)', median(value(x1),...value(xn))] ]
我尝试用以下代码实现:
import statistics for i in range(0,len(list1)): for j in range (0,len(list2)): if list1[i] in list2[j]: print(list1[i],statistics.median(int(list2[j][2])))
但运行时出现int object is not iterable错误,需要解决。
错误原因
statistics.median()函数要求参数是可迭代的数值集合(比如列表、元组),但你的代码每次只将单个value转成整数后传入,相当于给函数传了一个单独的int值,不符合参数要求,因此触发“int不可迭代”的错误。另外,你的逻辑是找到一个匹配的key就计算一次中位数,这也不符合需求——应该先收集同一个key对应的所有value,再统一计算中位数。
解决代码
以下是修正后的实现,先收集每个key对应的所有value,再计算中位数:
import statistics # 示例输入,可替换为实际数据 list1 = ['key(1)', 'key(2)'] list2 = [ ['key(1)', 'str(11)', '10'], ['key(1)', 'str(12)', '20'], ['key(1)', 'str(13)', '30'], ['key(2)', 'str(21)', '5'], ['key(2)', 'str(22)', '15'] ] output_list = [] for key in list1: values = [] for item in list2: # 精准匹配子列表的第一个元素(key列),避免误判 if item[0] == key: # 将value转为整数并加入收集列表 values.append(int(item[2])) # 确保有值时再计算中位数,避免空列表报错 if values: median_val = statistics.median(values) output_list.append([key, median_val]) print(output_list)
代码说明
- 遍历
list1中的每个关键词,为每个key初始化空列表values,用于收集对应的所有数值 - 遍历
list2时,精准匹配子列表的第一个元素(key字段),避免因其他位置出现相同字符串导致的误匹配 - 收集完当前key的所有value后,判断
values不为空再计算中位数,防止空列表传入median()引发新错误 - 最后将
[key, 中位数]的子列表加入output_list,符合需求的输出格式
内容的提问来源于stack exchange,提问作者JeanJack
相关产品推荐
相关产品推荐

