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

如何合并字典中实验变量相同的重复键并拼接对应值?

化学实验数据字典合并实现方案

核心思路

将每个字典键拆分为实验编号和实验标识后缀(即除编号外的剩余部分),通过实验标识后缀对条目分组,同一组内的列表值进行拼接,最终用组内最小的实验编号(或自定义规则)生成新键。

代码实现(Python原生)

首先定义你的原始字典:

original_dict = {
    '6_batch_pfoa_zif-8-fg-6': [1, 1, 1],
    '6_batch_pfoa_zif-8-fg-24': [2, 2, 2],
    '6_batch_genx_zif-8-fg-6': [3, 3, 3],
    '6_batch_genx_zif-8-fg-24': [4, 4, 4],
    '6_batch_pfos_zif-8-fg-6': [5, 5, 5],
    '6_batch_pfos_zif-8-fg-24': [6, 6, 6],
    '7_batch_pfoa_zif-8-fg-6': [7, 7, 7],
    '7_batch_pfoa_zif-8-fg-24': [8, 8, 8],
    '7_batch_pfos_zif-8-fg-6': [9, 9, 9],
    '8_batch_pfoa_zif-8-fg-6': [10, 10, 10],
    '8_batch_pfoa_fg': [11, 11, 11],
    '8_batch_genx_fg': [12, 12, 12],
    '8_batch_pfos_zif-8-fg-6': [13, 13, 13],
    '8_batch_pfos_fg': [14, 14, 14]
}

然后执行合并逻辑:

# 1. 按实验标识后缀分组,收集每组的实验编号和对应列表
grouped_data = {}
for key, values in original_dict.items():
    split_parts = key.split('_')
    exp_id = split_parts[0]
    suffix = '_'.join(split_parts[1:])
    if suffix not in grouped_data:
        grouped_data[suffix] = []
    grouped_data[suffix].append((int(exp_id), values))

# 2. 合并每组数据,用组内最小实验编号生成新键
merged_dict = {}
for suffix, items in grouped_data.items():
    # 按实验编号排序,取最小编号作为新键前缀
    items_sorted = sorted(items, key=lambda x: x[0])
    min_exp_id = str(items_sorted[0][0])
    # 拼接所有列表值
    combined_values = []
    for _, val in items_sorted:
        combined_values.extend(val)
    # 构造最终键值对
    merged_dict[f"{min_exp_id}_{suffix}"] = combined_values

执行后,merged_dict中会得到你需要的结果,例如:
'7_batch_pfoa_zif-8-fg-6': [7, 7, 7, 10, 10, 10]

Pandas实现方案(适合已有Pandas工作流)

如果你的数据是通过Pandas处理得到的,可以直接用DataFrame分组完成合并:

import pandas as pd

# 将原始字典转为DataFrame
df = pd.DataFrame(list(original_dict.items()), columns=['key', 'value'])
# 拆分键为实验编号和后缀
df['exp_id'] = df['key'].str.split('_').str[0]
df['suffix'] = df['key'].str.split('_', 1).str[1]

# 分组合并
merged_df = df.groupby('suffix').agg(
    min_exp_id=('exp_id', lambda x: x.min()),
    combined_value=('value', lambda x: [item for sublist in x for item in sublist])
).reset_index()

# 转换为目标字典
merged_dict = merged_df.apply(
    lambda row: (f"{row['min_exp_id']}_{row['suffix']}", row['combined_value']),
    axis=1
).to_dict()

自定义规则调整

  • 若不想用最小实验编号,可改为保留第一个出现的编号:将sorted(items, key=lambda x: x[0])改为直接取items[0]即可。
  • 若需要保留所有实验编号信息,可将新键设为类似merged_{suffix}的格式,或拼接所有编号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:55:22