Python库文件属性行分组问题:如何将同attr行归为列表子列表?
按属性分组生成子列表的解决方案
问题分析
你需要将库文件中同属性(如attr1、attr2)的行分组为子列表,作为生成笛卡尔积组合的基础结构。当前代码的核心问题是分组逻辑失效:所有行都匹配attr\d+正则表达式,导致else分支从未触发,最终所有行被合并到同一个列表中,无法实现按属性分组。
修正方案
核心思路是提取每行的属性标识(如attr1),以此为依据分组,以下是两种高效实现方式:
方法1:字典分组(推荐,大文件处理更高效)
用字典的Key存储属性标识,Value存储对应行的列表,最后将字典的值转为目标格式即可:
import re # 正则捕获属性标识(如attr1、attr2) pattern = re.compile(r'(attr\d+)') grouped_dict = {} with open(r"file path") as file: for line in file: line = line.strip() if not line: # 跳过空行 continue match = pattern.search(line) if match: attr_key = match.group(1) # 不存在则创建空列表,再添加当前行 grouped_dict.setdefault(attr_key, []).append(line) # 转换为期望的嵌套列表格式 grouped_elements = list(grouped_dict.values()) print(grouped_elements)
方法2:遍历跟踪当前属性
通过记录当前属性,当遇到不同属性时,保存当前组并创建新组:
import re pattern = re.compile(r'(attr\d+)') grouped_elements = [] current_group = [] current_attr = None with open(r"file path") as file: for line in file: line = line.strip() if not line: continue match = pattern.search(line) if match: attr = match.group(1) if current_attr is None: # 初始化第一个分组 current_attr = attr current_group.append(line) elif attr == current_attr: # 同属性,加入当前组 current_group.append(line) else: # 属性变更,保存当前组并重置 grouped_elements.append(current_group) current_attr = attr current_group = [line] # 处理最后一个未保存的分组 if current_group: grouped_elements.append(current_group) print(grouped_elements)
输出验证
针对示例输入,两种方法都会输出符合预期的结果:
[['attr1 apple 1','attr1 banana 2'], ['attr2 grapes 1','attr2 oranges 2'], ['attr3 watermelon 0']]
内容的提问来源于stack exchange,提问作者aditya
相关产品推荐
相关产品推荐

