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

如何从含重复键的两个嵌套列表生成字典列表?

处理嵌套键值对生成嵌套字典与Pandas DataFrame

问题描述

给定两组嵌套列表形式的键值输入,部分键(如K1、K2)对应多个值:

key_in = [['K1', 'K1', 'K2', 'K3'], ['K1', 'K2', 'K2', 'K3']]
val_in = [['V1', 'V2', 'V3', 'V4'], ['V5', 'V6', 'V7', 'V8']]

需要将其转换为嵌套字典列表:

out = [{'K1': {'V1', 'V2'}, 'K2': {'V3'}, 'K3': {'V4'}}, {'K1': {'V5'}, 'K2': {'V6', 'V7'}, 'K3': {'V8'}}]

最终目标是生成如下Pandas DataFrame(考虑到百万行数据的效率需求):

K1        K2       K3
0  {V1, V2}    {V3}     {V4}
1    {V5}    {V6, V7}   {V8}

直接使用dict(zip(k, v)) for k, v in zip(key_in, val_in)无法处理一对多的键值关系,会导致重复键的取值被覆盖。

解决方案

1. 纯Python方法生成嵌套字典列表

利用collections.defaultdict收集每个键对应的多个值,避免覆盖问题:

from collections import defaultdict

key_in = [['K1', 'K1', 'K2', 'K3'], ['K1', 'K2', 'K2', 'K3']]
val_in = [['V1', 'V2', 'V3', 'V4'], ['V5', 'V6', 'V7', 'V8']]

result_dicts = []
for keys, vals in zip(key_in, val_in):
    temp_dict = defaultdict(set)
    for k, v in zip(keys, vals):
        temp_dict[k].add(v)
    result_dicts.append(dict(temp_dict))

运行后result_dicts即为目标嵌套字典列表。

2. Pandas高效处理百万级数据生成目标DataFrame

对于百万行数据,Pandas的向量化分组聚合操作效率远高于纯Python循环,步骤如下:

import pandas as pd

# 将嵌套列表转换为长格式DataFrame
rows_data = []
for row_idx, (keys, vals) in enumerate(zip(key_in, val_in)):
    for k, v in zip(keys, vals):
        rows_data.append({'row_idx': row_idx, 'key': k, 'value': v})

df_long = pd.DataFrame(rows_data)

# 按行索引和键分组,聚合值为集合,再转为宽格式
df_final = df_long.groupby(['row_idx', 'key'])['value'].agg(set).unstack(fill_value=set())
# 清理格式
df_final.columns.name = None
df_final.reset_index(drop=True, inplace=True)

运行后df_final即为目标格式的DataFrame,该方法通过分组聚合避免了逐行循环的性能瓶颈,适合大规模数据处理。

内容的提问来源于stack exchange,提问作者nplusone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:21