如何将含二元集合的列表转换为键对应值列表的字典
问题描述
我有一个元素为集合的列表:
[{'prox', 'SIN'}, {'SIN', 'nerps'}, {'SIN', 'malzon'}, {'SIN', 'oportun'}, {'ANAT', 'head'}, {'ANAT', 'eyes'}]
想要转换成如下输出结构:
[{'SIN':['prox','nerps','malzon','oportun'],'ANAT':['head','eyes']}]
尝试了以下代码但执行失败:
d ={} for dictionary in l: for key, (k, v) in dictionary.items: if key not in d: d[key] = {} d[key][k] = v
报错信息:set has no items method,遍历列表时发现元素是集合,不知道该如何处理。
错误原因
你误将列表中的集合当成了字典来处理,集合没有items()方法,这是报错的直接原因。每个集合包含两个字符串,其中一个是分类键(如SIN、ANAT),另一个是对应的值,我们需要把相同键的值收集到列表中。
解决方法
根据集合中元素的特征区分每个集合里的键和值,再用字典来收集对应的值。
方案一:通过大小写区分键值
如果分类键都是全大写字符串,可以用这个方法:
original_list = [{'prox', 'SIN'}, {'SIN', 'nerps'}, {'SIN', 'malzon'}, {'SIN', 'oportun'}, {'ANAT', 'head'}, {'ANAT', 'eyes'}] result = {} for s in original_list: # 将集合转为列表,方便访问元素 items = list(s) # 判断哪个元素是键(全大写) if items[0].isupper(): key, value = items[0], items[1] else: key, value = items[1], items[0] # 初始化键对应的列表,再添加值 if key not in result: result[key] = [] result[key].append(value) # 包装成目标列表结构 final_output = [result] print(final_output)
方案二:通过预设键集合区分(更严谨)
如果预先知道所有分类键,可以用这个方法避免大小写判断的误差:
original_list = [{'prox', 'SIN'}, {'SIN', 'nerps'}, {'SIN', 'malzon'}, {'SIN', 'oportun'}, {'ANAT', 'head'}, {'ANAT', 'eyes'}] # 预先定义所有分类键 categories = {'SIN', 'ANAT'} result = {} for s in original_list: # 找出集合中属于分类键的元素 key = next(item for item in s if item in categories) # 获取集合中剩下的那个值 value = (s - {key}).pop() # 收集值到对应键的列表中 if key not in result: result[key] = [] result[key].append(value) final_output = [result] print(final_output)
输出结果
两种方案都会得到你想要的结构:
[{'SIN': ['prox', 'nerps', 'malzon', 'oportun'], 'ANAT': ['head', 'eyes']}]
内容的提问来源于stack exchange,提问作者noob4ever
相关产品推荐
相关产品推荐

