如何删除Python列表valid_list中不存在于jpg_list的关联元素
问题解答
错误原因
你代码输出不符合预期的核心问题是遍历valid_list的同时直接修改了原列表:
当你遍历到索引为3的元素'F'时,调用pop(val)删除该元素,此时valid_list的长度从6变为5,原本在索引4的'D'会前移到索引3的位置,但后续循环会直接进入val=4的校验,跳过了'D',最终就会丢失这个元素,得到错误的输出。
正确实现
根据你的需求,有两种常用实现方式:
方案1:只要元素存在对应的jpg文件就保留(符合你给出的期望输出)
先提取所有jpg文件对应的合法字母集合,再直接过滤valid_list即可,不需要修改原列表:
valid_list = ['A','B','C', 'F', 'D', 'E'] jpg_list = ['A:\\Admin_Version\\py_files\\images\\A.jpg', 'A:\\Admin_Version\\py_files\\images\\B.jpg', 'A:\\Admin_Version\\py_files\\images\\C.jpg', 'A:\\Admin_Version\\py_files\\images\\D.jpg', 'A:\\Admin_Version\\py_files\\images\\E.jpg'] def test(): # 提取所有存在的字母标识存入集合,用于快速校验 allowed_chars = set() for path in jpg_list: file_name = path.split('\\')[-1] char = file_name.rsplit('.', 1)[0] allowed_chars.add(char) # 过滤得到合法列表 return [item for item in valid_list if item in allowed_chars] a = test() print(a) # 输出:['A', 'B', 'C', 'D', 'E']
方案2:严格按索引位置一一对应校验
如果你的需求是valid_list的第n个元素必须匹配jpg_list第n个路径的文件名,注意提前处理索引越界问题,且不要修改原列表:
def test(): new_list = [] # 取两个列表的最小长度作为遍历上限,避免索引越界 max_index = min(len(valid_list), len(jpg_list)) for idx in range(max_index): current_char = valid_list[idx] if f"{current_char}.jpg" in jpg_list[idx]: new_list.append(current_char) return new_list
内容的提问来源于stack exchange,提问作者B A C H A S H
相关产品推荐
相关产品推荐

