首页 > 解决方案 > 如何构造 for 循环以给我正确的输出?生成的列表比应有的长

问题描述

我有两个列表 (tb_shadetb_sun),我正在尝试遍历它们,如果满足条件或不满足条件,则将 a 附加1到第三个列表 ( activity_status) 中0 tb_shade和列表的tb_sun长度相同(8760)。我正在尝试activity_status创建第三0tb_shade列表tb_sun1在那个范围内。我已经尝试了几种不同的方法。我在下面列出了其中的两个尝试。两者都不起作用。

0即使我知道有时满足条件,第一次尝试也会附加到列表中的所有行。第二次尝试的输出activity_status列表长度为 122268322 个值。它应该与 8760 的tb_suntb_shade列表相同。有谁知道如何让它运行?任何帮助或提示将不胜感激!谢谢!

第一次尝试

activity_status=[]    
for i,q in zip(tb_shade, tb_sun):
    if tb_shade[i] > (39) or tb_sun[q] < (29):
        activity_status.append(0)
    else:
        activity_status.append(1)
        

第二次尝试

    
activity_status=[]    
for i in range(len(tb_shade)):
    for q in range(len(tb_sun)):
        if tb_shade[i] > 39 or tb_sun[q] < 29:
            activity_status.append(0)
        if tb_shade[i] < 39 or tb_sun[q] > 29:
            activity_status.append(1)
print(len(activity_status)) #122268322
print(len(tb_shade)) #8760 

标签: pythonfor-loopjupyter-notebookiterator

解决方案


您在迭代中使用迭代,这为您提供了您期望的结果的平方。即,它不是从 0 到 8759 计数,而是从 0 到 8759 循环 8760 次。

相反,您可以使用一个 for 循环并使用它来迭代两个列表。

其次,您的标准与您所写的内容并不相互排斥。例如,如果 tb_shade 和 tb_sun 中的两个数字分别为 30 和 50,则两个 if 子句都满足并且它们都将执行。假设您正在尝试检查两种情况下的数字是否在 29 到 39 之间,我对您的代码进行了一些更改。

activity_status=[]    
for i in range(len(tb_shade)):
    if tb_shade[i]>29 and tb_shade[i]<39 and tb_sun[i]>29 and tb_sun[i]<39:
        activity_status.append(1)
    else:
        activity_status.append(0)

print(len(activity_status)) #should give 8760 if both lists are of length 8760
print(len(tb_shade)) #8760 

推荐阅读