如何在Python列表中基于相同键值合并元素(以category和code匹配为例)
合并同
category和code的对象(高效解法) 嘿,我完全懂你要解决的问题——把数组里category和code同时匹配的对象合并,而且不想用嵌套循环那种容易产生重复、效率还低的方案对吧?
嵌套循环确实不是最优解,不仅时间复杂度是O(n²),还容易出现重复处理的问题。这里给你一个更高效的思路,用Map做临时存储,只需要遍历一次数组就能完成合并,完美解决你的痛点。
核心逻辑
用category和code的组合作为唯一标识键,把每个对象按这个键存入Map:
- 如果键已经存在,就把当前对象的额外属性(比如NL、FR这类语言字段)合并到已有的对象里
- 如果键不存在,就直接把当前对象存入Map
最后把Map里的所有值提取成数组,就是你要的结果。
JavaScript 代码实现
// 输入数组 const input = [ { "category": "Nace2008", "code": "01110", "NL": "Teelt van granen (m.u.v. rijst), peulgewassen en oliehoudende zaden" }, { "category": "Nace2008", "code": "01110", "FR": "Culture de céréales (à l'exception du riz), de légumineuses et de graines oléagineuses" }, { "category": "Nace2008", "code": "01120", "FR": "Culture du riz" }, { "category": "Nace2008", "code": "01120", "NL": "Teelt van rijst" } ]; // 合并函数 const mergeMatchingObjects = (arr) => { const mergedMap = new Map(); arr.forEach(item => { // 生成唯一标识键:category + code 组合 const uniqueKey = `${item.category}-${item.code}`; // 拆分基础属性和语言属性 const { category, code, ...languageProps } = item; if (mergedMap.has(uniqueKey)) { // 合并现有对象与当前的语言属性 mergedMap.set(uniqueKey, { ...mergedMap.get(uniqueKey), ...languageProps }); } else { // 新键,直接存入完整对象 mergedMap.set(uniqueKey, { category, code, ...languageProps }); } }); // 将Map的值转换为数组返回 return Array.from(mergedMap.values()); }; // 执行合并 const output = mergeMatchingObjects(input); console.log(output);
最终输出
[ { "category": "Nace2008", "code": "01110", "NL": "Teelt van granen (m.u.v. rijst), peulgewassen en oliehoudende zaden", "FR": "Culture de céréales (à l'exception du riz), de légumineuses et de graines oléagineuses" }, { "category": "Nace2008", "code": "01120", "FR": "Culture du riz", "NL": "Teelt van rijst" } ]
这个方案的优势
- 效率更高:只遍历一次数组,时间复杂度为O(n),数据量越大,和嵌套循环的差距越明显
- 无重复问题:每个唯一组合只处理一次,不会出现重复合并的情况
- 扩展性强:如果以后需要增加新的匹配条件,只需要修改唯一键的生成规则即可
内容的提问来源于stack exchange,提问作者Thore
相关产品推荐
相关产品推荐

