Python新手求助:如何检查列表重复项并移至无重复的另一列表?
问题描述
我是Python编程新手,想要实现以下需求:从列表中筛选无重复项存入fileExtList,同时将原列表中重复出现的元素(仅保留唯一值)存入duplicatesList。
现有代码如下:
fileExt = ['json','csv','excel','parquet','csv','xml','pkl','json','json','csv','docx'] fileExtList = [] duplicatesList = [] for ext in fileExt: if ext not in fileExtList: fileExtList.append(ext) if ext in fileExtList and ext not in duplicatesList: duplicatesList.append(ext)
期望输出:
print(fileExtList) #Output: ['json','csv','excel','parquet','xml','pkl','docx'] print(duplicatesList) #Output: ['json','csv']
其中duplicatesList需无重复元素,仅包含原列表中出现过多次的元素。
问题分析与解决
你的代码问题在于:当元素第一次出现时,第一个if会把它加入fileExtList,紧接着的第二个if会因为ext刚被加入fileExtList,满足ext in fileExtList的条件,导致第一次出现的元素也被误加入duplicatesList。
这里提供两种简洁的解决思路:
方法一:计数统计(直观易理解)
先统计每个元素的出现次数,再分别生成目标列表:
fileExt = ['json','csv','excel','parquet','csv','xml','pkl','json','json','csv','docx'] # 统计每个元素的出现次数 count_dict = {} for ext in fileExt: count_dict[ext] = count_dict.get(ext, 0) + 1 # 生成无重复列表(保持原顺序) fileExtList = [] seen = set() for ext in fileExt: if ext not in seen: fileExtList.append(ext) seen.add(ext) # 生成重复元素列表(仅保留出现多次的元素) duplicatesList = [ext for ext, count in count_dict.items() if count > 1] print(fileExtList) # ['json','csv','excel','parquet','xml','pkl','docx'] print(duplicatesList) # ['json','csv']
方法二:遍历过程中记录状态(高效单遍历)
fileExt = ['json','csv','excel','parquet','csv','xml','pkl','json','json','csv','docx'] fileExtList = [] duplicatesList = [] seen = set() added_to_duplicates = set() for ext in fileExt: if ext not in seen: fileExtList.append(ext) seen.add(ext) else: if ext not in added_to_duplicates: duplicatesList.append(ext) added_to_duplicates.add(ext) print(fileExtList) # ['json','csv','excel','parquet','xml','pkl','docx'] print(duplicatesList) # ['json','csv']
内容的提问来源于stack exchange,提问作者Alejandro López Domínguez
相关产品推荐
相关产品推荐

