如何基于正确索引从两个数组创建目标格式的字典?
问题:按数组映射构建分组字典
给定两个数组:
L1 = array([2, 3, 5, 2, 5, 2, 3]) L2 = array([1.2, 3.3, 5.7, 1.6, 5.5, 1.5, 3.4])
需要构建如下格式的字典,将L1中的相同元素对应到L2中所有匹配位置的元素列表:
dict_ = {2: [1.2, 1.6, 1.5], 3: [3.3, 3.4], 5: [5.7, 5.5]}
原尝试代码:
dict_ = {} for ts, te in zip(L1, L2): if ts not in dict_.keys(): dict_[ts] = ts dict_.update({ts: te}) if ts in dict_.keys(): dict_[ts] = [dict_[ts], te]
原代码问题分析
- 初始赋值逻辑冗余错误:当
ts不在字典中时,先将dict_[ts]设为ts(数值类型),随后又用update覆盖为te(浮点类型),完全没必要。 - 列表构建方式错误:每次遇到已存在的
ts时,直接将当前值和te包装成新列表,会生成嵌套列表(比如第三次遇到2时,会得到[[1.2, 1.6], 1.5]),不符合扁平列表的预期格式。
正确解法
方法1:基础循环实现
初始化空字典,遍历配对元素时,判断键是否存在:不存在则创建空列表再追加元素;存在则直接追加元素。
dict_ = {} for ts, te in zip(L1, L2): if ts not in dict_: dict_[ts] = [] dict_[ts].append(te)
方法2:使用collections.defaultdict简化代码
defaultdict可以自动为不存在的键初始化指定类型(此处为列表),省去手动判断的逻辑:
from collections import defaultdict dict_ = defaultdict(list) for ts, te in zip(L1, L2): dict_[ts].append(te) # 若需要转为普通字典(可选操作) dict_ = dict(dict_)
方法3:使用itertools.groupby(需先排序)
如果允许先对L1和L2按L1的值排序,可通过groupby批量完成分组:
from itertools import groupby from operator import itemgetter # 先将配对元素按L1的值排序 sorted_pairs = sorted(zip(L1, L2), key=itemgetter(0)) dict_ = {k: [v for _, v in g] for k, g in groupby(sorted_pairs, key=itemgetter(0))}
以上三种方法均能生成符合要求的字典结构。
内容的提问来源于stack exchange,提问作者Mass17
相关产品推荐
相关产品推荐

