Python嵌套列表元素匹配问题:如何检查列表元素是否存在于嵌套列表并生成指定格式结果
问题分析与代码修正
先看你代码里的几个明显问题,直接导致输出不符合预期:
- 你写了
if item == insulation:,但insulation这个变量根本没定义,这明显是笔误,本来要检查的是list2里的元素 - 初始的
models是一维字符串列表,但你预期的是二维列表,所以初始化的时候就得把每个model包装成子列表 - 匹配逻辑完全不对,你需要遍历list2的元素,检查它们是否在cleaned_data的某个子列表里,然后找到对应的model,把匹配元素追加到对应位置
下面是修正后的完整代码,我会一步步解释:
import re a = "sample.txt" # Contains multiple rows like "model1//h//4385////ffm1//gg5////lmm" cleaned_data = [] def split_lines(lines, delimiter, remove='^[0-9.]+$'): for line in lines: tokens = line.split(delimiter) # 移除匹配正则的内容,同时去除前后空格,避免空字符串残留 tokens = [re.sub(remove, "", token).strip() for token in tokens] clean_list = list(filter(lambda e: e, tokens)) cleaned_data.append(clean_list) # 读取文件并处理数据 with open(a, 'r') as file: lines = [line.rstrip('\n') for line in file] split_lines(lines, "/") list2 = ['gg5', 'pp6', 'gg7'] # 待检查的元素列表 # 初始化models为二维列表,每个元素是[model_name],同时避免重复添加相同model models = [] for item in cleaned_data: model_name = item[0] if not any(m[0] == model_name for m in models): models.append([model_name]) # 遍历cleaned_data的每个子列表,匹配list2中的元素并追加到对应model的子列表 for sub_list in cleaned_data: current_model = sub_list[0] # 找到当前model在models中的索引 model_idx = next(i for i, m in enumerate(models) if m[0] == current_model) # 筛选出当前子列表中存在的list2元素 matched_items = [item for item in list2 if item in sub_list] # 把匹配到的元素追加到对应位置(如果需要去重可以加判断:if matched_items[0] not in models[model_idx]) if matched_items: models[model_idx].append(matched_items[0]) print(models)
关键修正点说明:
- 初始化models为二维列表:原来的
models.append(item[0])会得到一维字符串列表,现在改成models.append([model_name]),让每个model都是一个子列表,方便后续追加元素。 - 修复匹配逻辑:
- 遍历
cleaned_data的每个子列表,先找到对应的model在models中的索引 - 用列表推导式快速筛选出当前子列表中存在的
list2元素 - 把匹配到的元素追加到对应model的子列表里
- 遍历
- 优化数据清洗:给正则处理后的结果加上
strip(),避免残留空格导致空字符串没被过滤干净。 - 移除未定义变量:把错误的
insulation替换成正确的list2元素检查逻辑。
这样运行后,就能得到你预期的类似[['model1', 'gg5'], ['model2', 'pp6'], ['model3', 'gg5']]的输出。
内容的提问来源于stack exchange,提问作者Chaotic.Python
相关产品推荐
相关产品推荐

