如何基于公共ID分组元组列表中的大规模同义词数据集?
处理同义词分组的实现方案
这问题用字典做分组是最直接高效的,针对你这个10000+条数据的场景,我给你两种实用的实现思路,都能轻松搞定:
方法一:普通字典手动分组(兼容所有Python版本)
这种写法逻辑清晰,不需要额外导入模块,适合任何Python环境:
def process_synonyms(data): # 初始化字典,用来存储每个ID对应的同义词列表 id_synonym_map = {} for syn_id, word in data: # 如果ID不在字典里,先创建一个空列表 if syn_id not in id_synonym_map: id_synonym_map[syn_id] = [] # 将当前单词添加到对应ID的列表中 id_synonym_map[syn_id].append(word) # 将字典转换为目标格式的元组列表 processed_data = [] for syn_id, words in id_synonym_map.items(): # 把ID和同义词列表拼接成一个元组 processed_tuple = (syn_id,) + tuple(words) processed_data.append(processed_tuple) return processed_data
逻辑说明
- 遍历原始数据,把每个共享ID对应的同义词都收集到字典的列表中;
- 遍历字典的键值对,把ID和对应的同义词列表合并成一个元组,最终组成结果列表。
这个方法的时间复杂度是O(n),处理10000+条数据毫无压力,而且不需要提前排序,Python 3.7+的普通字典默认保留ID首次出现的顺序,旧版本可以用OrderedDict替代。
方法二:用collections.defaultdict简化代码
如果你的Python版本支持(几乎所有现代版本都支持),可以用defaultdict来省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict def process_synonyms(data): id_synonym_map = defaultdict(list) # 直接往对应ID的列表里加单词,无需判断键是否存在 for syn_id, word in data: id_synonym_map[syn_id].append(word) # 用列表推导式快速转换格式 return [(syn_id,) + tuple(words) for syn_id, words in id_synonym_map.items()]
测试示例
用你给出的测试数据跑一下:
data = [ (435347,'cat'), (435347,'feline'), (435347,'lion'), (6765756,'dog'), (6765756,'hound'), (6765756,'puppy'), (435347,'kitten'), (987977,'frog') ] print(process_synonyms(data))
输出结果就是你想要的格式:
[(435347, 'cat', 'feline', 'lion', 'kitten'), (6765756, 'dog', 'hound', 'puppy'), (987977, 'frog')]
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

