Python新手求助:从二维数组生成字典与数组遇IndexError如何修复?
修复你的Python代码:解决IndexError并得到理想输出
首先,咱们先搞清楚你遇到的IndexError是怎么回事:你的代码里写了data[i][j][2],但看你的data结构,每个小列表比如['A','A']只有2个元素,索引只能是0和1,根本没有索引2,这就是报错的直接原因。
接下来,咱们梳理你的需求:
dct要把每个大数组里A标记对应的第二个值(比如['A','A']里的'A')作为键,对应W标记的第二个值(比如['W','NY']里的'NY')作为值,相同键的话把值放到一个列表里ans要收集所有S标记的第二个值,并且按A组在前、B组在后的顺序排列(对应理想输出的['apple','summung','windows','Lenovo'])
那咱们重新调整代码逻辑,修复后的代码如下:
data = [ [['A','A'],['S','apple'],['W','NY']], [['A','B'],['S','windows'],['W','CF']], [['A','B'],['S','Lenovo'],['W','CH']], [['A','A'],['S','summung'],['W','KL']] ] dct = {} # 先分组收集S的值,方便最后按A、B顺序生成ans s_groups = {'A': [], 'B': []} for item in data: # 从每个大数组里提取三个部分 a_part = item[0] s_part = item[1] w_part = item[2] a_key = a_part[1] # 比如'A'或'B' s_value = s_part[1] # 比如'apple' w_value = w_part[1] # 比如'NY' # 处理字典dct if a_key not in dct: dct[a_key] = [] dct[a_key].append(w_value) # 把S值按A、B分组 s_groups[a_key].append(s_value) # 生成ans:先A组的S值,再B组的S值 ans = s_groups['A'] + s_groups['B'] print("dct:", dct) print("ans:", ans)
运行这段代码后,你会得到理想的输出:
dct: {'A': ['NY', 'KL'], 'B': ['CF', 'CH']}ans: ['apple', 'summung', 'windows', 'Lenovo']
为什么之前的代码不对?
- 索引错误:你错误地尝试访问每个小列表的第三个元素(索引2),但每个小列表只有两个元素,索引范围是0-1
- 逻辑混乱:你遍历了每个大数组里的所有小列表(j循环),但实际上每个大数组里的三个小列表是一组配套数据,应该整体处理,而不是逐个遍历小列表
如果你想更简洁一点,还可以用collections.defaultdict来简化字典的初始化:
from collections import defaultdict data = [ [['A','A'],['S','apple'],['W','NY']], [['A','B'],['S','windows'],['W','CF']], [['A','B'],['S','Lenovo'],['W','CH']], [['A','A'],['S','summung'],['W','KL']] ] dct = defaultdict(list) s_groups = defaultdict(list) for item in data: a_key = item[0][1] s_value = item[1][1] w_value = item[2][1] dct[a_key].append(w_value) s_groups[a_key].append(s_value) ans = s_groups['A'] + s_groups['B'] print(dict(dct)) # 转换成普通字典输出 print(ans)
这样代码会更简洁,defaultdict会自动为不存在的键创建空列表,省去了if a_key not in dct的判断。
内容的提问来源于stack exchange,提问作者user7523656
相关产品推荐
相关产品推荐

