python - 为什么 for 循环和 if 语句在 python 中的两个列表中不能正常工作?
问题描述
我有一些数据要读取,但我不知道为什么我的代码不起作用。我想读取多个 netcdf 文件并将它们存储在 ds. 这是我的简化输入(我的列表名称和文件路径中有大约 400 个条目,而不是 4 个):
names = ['a','b','c','d']
file_paths = ['file_path_a','file_path_b',file_path_c',file_path_d']
number_of_measurements = []
for a, b in zip(names, file_paths):
a = xr.open_dataset(b, group='data')
number_of_measurements.append(len(a.datetime))
我想在 len(a.datetime) == 0 时删除 files_paths 和 number_of_measurements 中的条目(这意味着没有测量完成)。我需要 number_of_measurements 来为其他功能创建计数器。
我试过这个:
for i, j in zip(number_of_measurements, file_paths):
if i == 0:
file_paths.remove(j)
number_of_measurements.remove(i)
这似乎有效,但并非总是如此,在此 for 循环之前我有 number_of_measurements.count(0) = 33,在 for 循环之后我有 number_of_measurements = 4。当我执行两次 for 循环时,我有想要的 number_of_measurements.count(0) = 0. 为什么第一次不能正常工作?
我也在第一个 for 循环中尝试了这个,但它也不起作用,我不知道为什么:
for a, b in zip(names, file_paths):
a = xr.open_dataset(b, group='data')
if len(a.datetime) == 0:
file_paths.remove(b)
else:
number_of_measurements.append(len(a.datetime))
解决方案
通常不建议在迭代自身时修改序列。例如:
li = [1, 2, 3]
for x in li:
l.remove(x)
人们可能会期望li
现在是一个空列表。然而,
>>> li
>>> [2]
这是由于列表迭代器的工作方式。在 for 循环的第一次迭代中,x
分配了 list 的第一个元素1
。然后1
从列表中删除。li
现在成立[2, 3]
。当 for 循环移动到第二次迭代时,x
分配列表的第二个元素。但是列表的第二个元素是3
现在。因此2
永远不会从列表中删除。
出于您的目的,您可以构建一个新列表而不是修改原始列表。
number_of_measurements = []
file_paths_new = []
for b in file_paths:
x = len(xr.open_dataset(b, group='data').datetime)
if x != 0:
number_of_measurements.append(x)
file_paths_new.append(x)
file_paths = file_paths_new
推荐阅读
- git - 从远程创建本地 git repo
- go - 使用闪亮的驱动程序将更改发布到窗口
- plugins - OJS 中的插件问题,禁用自定义管理器并且无法启用
- css - Mendix 自定义 CSS 将分页按钮放置在模板网格底部单击第一页或最后一页时擦除弹出窗口
- python - Flask-Babel 在开发中工作,但在生产中没有翻译
- xaml - 访问 ListView 中不是来自 ItemsSource 的属性
- azure-devops - 如何在 Azure Devops 发布管道中读取多行 Azure Key Vault 机密
- regex - 使用正则表达式时,nginx位置块不指向位置目录
- c# - 以管理员身份运行.net core 3.1窗口服务需要启动winform应用程序
- mysql - 从 Mac 上的设置初始化数据库后,现有的 mysql 数据库丢失