You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于正确索引从两个数组创建目标格式的字典?

问题:按数组映射构建分组字典

给定两个数组:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:50:31