遍历双列表补0生成等长值列表的代码问题排查
问题分析:分组收集值并补0的代码错误原因
输入数据
x = ['A', 'B', 'B', 'C', 'D', 'D', 'D'] y = [ 4 , 3 , 5 , 9 , 1 , 6 , 2 ]
期望输出
{'A': [4, 0, 0], 'B': [3, 5, 0], 'C': [9, 0, 0], 'D': [1, 6, 2]}
逻辑规则
- 按
x中的字母分组收集y的对应值 - 补0至与出现次数最多的字母的长度一致(此处
D出现3次,目标长度为3)
错误代码及结果
错误代码
from collections import Counter c = Counter(x) max_length = c.most_common()[0][-1] my_dict = {} for ix, iy in zip(x,y): my_dict[ix] = [iy] + [0 for _ in range(max_length-1)]
错误输出
{'A': [4, 0, 0], 'B': [5, 0, 0], 'C': [9, 0, 0], 'D': [2, 0, 0]}
代码问题分析
- 覆盖已有分组值:循环中每次遇到相同的
ix(如B、D),都会直接用当前的iy生成新列表覆盖之前的赋值。比如B第一次循环时被设为[3,0,0],第二次遇到B时直接替换成[5,0,0],导致第一个B对应的3丢失;D最终只保留了最后一个值2。 - 未实现分组收集逻辑:代码没有先把同一分组的所有
y值收集起来,而是每次都单独生成一个仅包含当前iy的补0列表,完全忽略了同组的其他值。
修正代码示例
先收集每个分组的所有对应值,再统一补0到最大长度:
from collections import Counter x = ['A', 'B', 'B', 'C', 'D', 'D', 'D'] y = [4, 3, 5, 9, 1, 6, 2] c = Counter(x) max_length = c.most_common()[0][-1] my_dict = {} # 第一步:收集每个分组的所有y值 for ix, iy in zip(x, y): if ix not in my_dict: my_dict[ix] = [] my_dict[ix].append(iy) # 第二步:统一补0至最大长度 for key in my_dict: my_dict[key] += [0] * (max_length - len(my_dict[key])) print(my_dict) # 输出:{'A': [4, 0, 0], 'B': [3, 5, 0], 'C': [9, 0, 0], 'D': [1, 6, 2]}
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

