如何避免向列表重复添加元素?循环中为groups_of_files添加唯一文件路径
如何在循环中避免重复,仅添加唯一文件路径到groups_of_files列表中?
原代码存在的问题
你的代码有两处逻辑错误,同时缺少去重机制:
- 判断扩展名时用了
groups_of_format.values(),会匹配所有格式组的格式,导致一个文件可能被错误添加到多个组; - 索引
groups_of_files时用groups_of_format.keys()是错误的,应该使用当前循环的name_group; - 没有检查文件是否已存在,循环迭代会导致重复添加。
解决方案
以下提供两种实现方式,按需选择:
方式一:添加前检查是否存在(适合小体量文件列表)
先修正逻辑错误,再在添加文件前检查是否已存在于目标组的列表中:
# 可选:预处理格式组,将所有格式转为大写,提升后续判断效率 groups_of_format = {group: {fmt.upper() for fmt in formats} for group, formats in groups_of_format.items()} for file in files_names: # 获取文件扩展名并转为大写(处理无扩展名的文件) ext = file.split('.')[-1].upper() if '.' in file else '' # 遍历每个格式组 for name_group, formats in groups_of_format.items(): if ext in formats: # 检查文件未存在时再添加 if file not in groups_of_files[name_group]: groups_of_files[name_group].append(file)
方式二:用集合自动去重(高效处理大量文件)
利用集合自动去重的特性,先将每个组的容器设为集合,最后按需转成列表:
# 预处理格式组,统一转为大写 groups_of_format = {group: {fmt.upper() for fmt in formats} for group, formats in groups_of_format.items()} # 初始化groups_of_files为集合类型 groups_of_files = {group: set() for group in groups_of_format.keys()} for file in files_names: ext = file.split('.')[-1].upper() if '.' in file else '' for name_group, formats in groups_of_format.items(): if ext in formats: # 集合自动忽略重复元素 groups_of_files[name_group].add(file) # 若需要列表类型,将集合转为列表 groups_of_files = {group: list(files) for group, files in groups_of_files.items()}
内容的提问来源于stack exchange,提问作者Pain
相关产品推荐
相关产品推荐

