已知分类名称,如何将含分类项的一维列表转换为字典
如何将分类项前置的一维列表转换为分类键字典
问题描述
现有一维列表l1,内容为分类项后跟对应元素,同时已知所有分类名称组成的列表l2,需要将l1转换为以分类为键、对应元素列表为值的字典。
示例:
输入列表:
l1 = ['cat1', 'a', 'b', 'c', 'cat2', 1, 2, 3, 'cat3', 4, 5, 6, 7, 8]
分类列表:
l2 = ['cat1', 'cat2', 'cat3']
目标字典:
l1_dic = {'cat1': ['a', 'b', 'c'], 'cat2': [1, 2, 3], 'cat3': [4, 5, 6, 7, 8]}
注:分类名称无共同特征,可替换为任意名称如'Name'、'Address'。
解决方案
方法一:遍历追踪当前分类
这是最直观的实现方式,遍历l1时遇到分类项就切换当前键,否则将元素追加到当前键对应的列表中。
l1 = ['cat1', 'a', 'b', 'c', 'cat2', 1, 2, 3, 'cat3', 4, 5, 6, 7, 8] l2 = ['cat1', 'cat2', 'cat3'] l1_dic = {} current_key = None for item in l1: if item in l2: current_key = item l1_dic[current_key] = [] else: if current_key is not None: l1_dic[current_key].append(item) print(l1_dic)
输出结果:
{'cat1': ['a', 'b', 'c'], 'cat2': [1, 2, 3], 'cat3': [4, 5, 6, 7, 8]}
方法二:按分类索引分割列表
先获取所有分类在l1中的位置,再根据索引区间提取对应元素,适合需要一次性处理所有区间的场景。
l1 = ['cat1', 'a', 'b', 'c', 'cat2', 1, 2, 3, 'cat3', 4, 5, 6, 7, 8] l2 = ['cat1', 'cat2', 'cat3'] # 获取每个分类在l1中的索引,添加列表末尾索引处理最后一组元素 indices = [l1.index(cat) for cat in l2] indices.append(len(l1)) l1_dic = {} for i in range(len(l2)): cat = l2[i] # 提取当前分类到下一个分类之间的元素 elements = l1[indices[i]+1 : indices[i+1]] l1_dic[cat] = elements print(l1_dic)
输出结果与方法一完全一致。
注意事项
- 若
l1存在l2未定义的分类项,方法一会忽略这些项及其后续元素(直到遇到合法分类),方法二则直接跳过未定义分类; - 方法二依赖
l2中分类与l1中出现顺序一致,若分类顺序不确定,优先使用方法一。
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

