如何合并嵌套字典列表中多个'descr'键的多值至同一键?
合并嵌套字典列表中的多个
descr键值对 当然可行!咱们来一步步解决这个问题:
先看你的原始数据:
original_data = [ [ {'end': 3250741247, 'ip_range': '193.194.64.0 - 193.194.95.255', 'start': 3250733056}, {'descr': 'PROVIDER'}, {'descr': 'Algerian Academic Research Network'}, {'country': 'DZ'} ], [ {'end': 3273187327, 'ip_range': '195.24.192.0 - 195.24.223.255', 'start': 3273179136}, {'descr': 'Data communication and international'}, {'descr': 'telecommunication of Cameroon'}, {'country': 'CM'} ] ]
你的尝试代码没成功,主要是因为字典推导的逻辑有误,而且只是追加了新字典,没有替换原来的多个descr项。下面是两种可行的实现方式:
方法1:合并为列表(推荐)
这种方式保留了所有描述的独立性,方便后续操作:
def merge_descr_to_list(data): processed_data = [] for block in data: # 分离非descr字典和收集descr值 non_descr_dicts = [] descr_values = [] for dic in block: if 'descr' in dic: descr_values.append(dic['descr']) else: non_descr_dicts.append(dic) # 如果有收集到descr值,添加合并后的字典 if descr_values: non_descr_dicts.append({'descr': descr_values}) processed_data.append(non_descr_dicts) return processed_data # 调用函数处理数据 result = merge_descr_to_list(original_data) print(result)
运行后得到的正确结果:
[ [ {'end': 3250741247, 'ip_range': '193.194.64.0 - 193.194.95.255', 'start': 3250733056}, {'country': 'DZ'}, {'descr': ['PROVIDER', 'Algerian Academic Research Network']} ], [ {'end': 3273187327, 'ip_range': '195.24.192.0 - 195.24.223.255', 'start': 3273179136}, {'country': 'CM'}, {'descr': ['Data communication and international', 'telecommunication of Cameroon']} ] ]
方法2:合并为拼接字符串
如果需要把描述合并成一个可读性更强的字符串,只需要修改添加descr字典的部分:
def merge_descr_to_string(data, separator=', '): processed_data = [] for block in data: non_descr_dicts = [] descr_values = [] for dic in block: if 'descr' in dic: descr_values.append(dic['descr']) else: non_descr_dicts.append(dic) if descr_values: # 用指定分隔符拼接所有描述 non_descr_dicts.append({'descr': separator.join(descr_values)}) processed_data.append(non_descr_dicts) return processed_data # 调用示例 result = merge_descr_to_string(original_data) print(result)
得到的结果:
[ [ {'end': 3250741247, 'ip_range': '193.194.64.0 - 193.194.95.255', 'start': 3250733056}, {'country': 'DZ'}, {'descr': 'PROVIDER, Algerian Academic Research Network'} ], [ {'end': 3273187327, 'ip_range': '195.24.192.0 - 195.24.223.255', 'start': 3273179136}, {'country': 'CM'}, {'descr': 'Data communication and international, telecommunication of Cameroon'} ] ]
核心逻辑说明
- 遍历每个子列表(
block),把里面的字典分成两类:不含descr的直接保留,含descr的提取值收集起来 - 收集完所有
descr值后,创建一个新的descr字典,值为列表或拼接字符串 - 把新的
descr字典加入到保留的非descr字典列表中,组成处理后的block - 所有
block处理完成后返回结果
内容的提问来源于stack exchange,提问作者bvlal
相关产品推荐
相关产品推荐

