首页 > 解决方案 > 为什么 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))

标签: pythonlistfor-loopif-statement

解决方案


通常不建议在迭代自身时修改序列。例如:

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 

推荐阅读