Python代码无法移除列表中重复完整字符串的问题排查
移除列表重复项问题排查与解决
问题背景
我在处理云存储桶路径时,尝试移除重复的路径项,但当前代码无法实现去重,输出存在大量重复的路径条目。
原代码
def my_list_bucket(self, bucketName, limit=sys.maxsize): #delimiter='/'): a_bucket = self.storage_client.lookup_bucket(bucketName) bucket_iterator = a_bucket.list_blobs() for resource in bucket_iterator: path_parts = resource.name.split('/') date_folder = path_parts[0] publisher_folder = path_parts[1] desired_path = date_folder + '/' + publisher_folder + '/' new_list = [] for path in desired_path: if desired_path not in new_list: new_list.append(desired_path) print(new_list) limit = limit - 1 if limit <= `0: break
当前输出
20230130/adelphic/
20230130/adelphic/
20230130/adelphic/
20230130/adelphic/
20230130/instacart/
20230130/instacart/
20230130/instacart/
20230130/instacart/
期望输出
20230130/adelphic/
20230130/instacart/
错误尝试
我曾尝试用new_list = list(set(publisher_folder))去重,但得到的是拆分后的单个字符集合:
'i', 'p', 'a', 'c', 'd', 'h', 'e', 'l'
'i', 'p', 'a', 'c', 'd', 'h', 'e', 'l'
'i', 'p', 'a', 'c', 'd', 'h', 'e', 'l'
问题分析
- 列表初始化位置错误:每次循环都重新创建
new_list,无法累积所有路径进行去重判断 - 遍历对象错误:
for path in desired_path是遍历字符串的每个字符,而非处理完整路径 - 语法错误:
limit <=0:中的反引号是非法字符,应改为直接写0` - 错误使用集合:直接对
publisher_folder字符串转集合,会把字符串拆成单个字符,而非处理完整路径
修正方案
方案一:使用列表去重
import sys def my_list_bucket(self, bucketName, limit=sys.maxsize): a_bucket = self.storage_client.lookup_bucket(bucketName) bucket_iterator = a_bucket.list_blobs() new_list = [] # 移到循环外,累积所有路径 for resource in bucket_iterator: path_parts = resource.name.split('/') date_folder = path_parts[0] publisher_folder = path_parts[1] desired_path = date_folder + '/' + publisher_folder + '/' # 直接判断完整路径是否已存在 if desired_path not in new_list: new_list.append(desired_path) limit -= 1 if limit <= 0: break # 最后统一打印去重结果 for path in new_list: print(path)
方案二:使用集合高效去重(推荐)
集合的存在性判断效率更高,适合处理大量路径:
import sys def my_list_bucket(self, bucketName, limit=sys.maxsize): a_bucket = self.storage_client.lookup_bucket(bucketName) bucket_iterator = a_bucket.list_blobs() path_set = set() # 集合自动去重 for resource in bucket_iterator: path_parts = resource.name.split('/') date_folder = path_parts[0] publisher_folder = path_parts[1] desired_path = date_folder + '/' + publisher_folder + '/' path_set.add(desired_path) # 集合自动忽略重复项 limit -= 1 if limit <= 0: break # 转成列表并打印 for path in list(path_set): print(path)
关键修改点
- 将存储去重结果的容器(列表/集合)初始化移到循环外部,确保能累积所有路径
- 直接对完整的
desired_path进行存在性判断,不再遍历字符串字符 - 修复语法错误,将
limit <=0:改为limit <= 0` - 使用集合时,要对完整路径操作,而非单个字符串拆分后的字符
内容的提问来源于stack exchange,提问作者DarrenC
相关产品推荐
相关产品推荐

