Python 3.6中zip对象不可下标访问,转列表/元组仍报错求解
针对你的Python 3.6 zip命名问题的解决方案
嘿,我明白你现在的困扰——明明把zip转成列表或者元组了,还是没法用monthyear里的内容给要素类命名,这确实挺让人头疼的。结合你说的情况,我给你梳理几个大概率能解决问题的方向:
1. 先确认zip迭代时有没有正确拿到monthyear的单个元素
很多时候问题出在循环解包上。比如你可能不小心把整个monthyear列表塞进了文件名,而不是zip迭代时对应的单个元素。举个反例,错误的写法可能是这样:
monthyear = ["202401", "202402"] other_datasets = [dataset1, dataset2] zipped = list(zip(other_datasets, monthyear)) # 错误:这里遍历的是zip里的每个元组,但直接用了整个monthyear列表 for item in zipped: outFeatureClass = f"path/to/output_{monthyear}.shp"
正确的做法应该是在循环里把zip的每个元组解包,拿到对应的monthyear元素:
monthyear = ["202401", "202402"] other_datasets = [dataset1, dataset2] # 不管是直接用zip还是转成列表,都要正确解包 for data, my in zip(other_datasets, monthyear): outFeatureClass = f"path/to/output_{my}.shp" # 这里用单个元素my,不是整个列表
2. 检查字符串格式化的细节
Python 3.6的f-string是好用,但如果变量名写错、或者元素类型不兼容(比如monthyear里是整数),也会出问题:
- 如果monthyear里是整数,f-string会自动转成字符串,但保险起见也可以手动转:
f"output_{str(my)}.shp" - 要是不用f-string,用
str.format()的话,要确保占位符和变量对应:"output_{0}.shp".format(my)
3. 确认zip的两个序列长度匹配
如果monthyear和另一个要zip的序列长度不一样,zip会以短的那个为准,导致部分元素没被遍历到,这时候你可能会发现有些命名没按预期生成。可以先打印两个列表的长度确认:
print(len(monthyear), len(other_datasets))
给你一个完整的可参考示例(假设你在用ArcPy处理要素类):
import arcpy import os monthyear = ["202401", "202402", "202403"] input_fcs = ["input1.shp", "input2.shp", "input3.shp"] output_dir = "C:/your/output/dir" # 先确保输出目录存在 if not os.path.exists(output_dir): os.makedirs(output_dir) # 正确结合zip和命名逻辑 for in_fc, my in zip(input_fcs, monthyear): out_fc_path = os.path.join(output_dir, f"processed_{my}.shp") # 这里写你的要素处理代码,比如复制、投影等 arcpy.CopyFeatures_management(in_fc, out_fc_path) print(f"成功生成: {out_fc_path}")
如果还有特定的错误提示,你可以补充出来,但按常见情况来看,上面的方法应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Matt A.
相关产品推荐
相关产品推荐

