Python for循环中如何判断当前是否遍历到最后一个元素
解决方案
你原代码里判断是否跳出循环的逻辑存在错误:len(upload_list[:-1])只会计算原列表排除最后一个元素后的长度,和当前遍历的位置完全无关,根本无法判断是否走到了最后一个元素。
要判断当前遍历项是不是最后一个,直接用enumerate返回的索引和列表总长度对比即可:Python序列索引从0开始,最后一个元素的索引永远是「列表长度 - 1」。
修正后完整代码
... libera_client = libera_get_client(endpoint=endpoint, access_key=access_key, secret_key=secret_key, region=region) libera_transfer = s3transfer.create_transfer_manager(libera_transfer_client, transfer_config) all_segments_uploaded = False retry_list = [] while not all_segments_uploaded: upload = None if len(retry_list) > 0: for src, dst in retry_list: upload = libera_transfer.upload(fileobj=src, bucket=bucket, key=dst, subscribers=[s3transfer.ProgressCallbackInvoker(progress_func)]) else: for src, dst in upload_list: upload = libera_transfer.upload(fileobj=src, bucket=bucket, key=dst, subscribers=[s3transfer.ProgressCallbackInvoker(progress_func)]) upload.result() # 等待上传完成 # 提前计算待校验列表总长度,避免循环内重复计算 list_total_len = len(upload_list) for idx, (src, dst) in enumerate(upload_list): print(f'HEAD Object validation of upload: {dst}') try: libera_client.head_object(Bucket=bucket, Key=dst, ChecksumMode='ENABLED') except ClientError as e: all_segments_uploaded = False retry_list.append([src, dst]) print(f'Integrity check failed with: {e}, Upload will get reinitialized until completion!') # 非最后一个元素校验失败,直接跳出校验循环进入下一轮重试 if idx != list_total_len - 1: break continue all_segments_uploaded = True # 遍历到最后一个元素,直接break跳出循环 if idx == list_total_len - 1: break libera_transfer.shutdown() return libera_transfer
核心逻辑说明
- 去掉了原代码里冗余的列表推导写法,直接遍历原列表即可,减少不必要的性能损耗
- 提前计算待校验列表的总长度,避免循环内重复执行切片、长度计算逻辑
- 用当前遍历的索引
idx和list_total_len - 1做对比,相等就代表当前处理的是最后一个元素 - 校验成功走到最后一个元素时,直接触发break跳出校验循环,完全匹配需求
- 修正了原逻辑里错误的跳出判断:非最后一个元素校验失败时才提前跳出循环,最后一个元素校验失败会正常记录到重试列表,进入下一轮上传重试
内容的提问来源于stack exchange,提问作者user18726875
相关产品推荐
相关产品推荐

