首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构造for循环以给出正确的输出?生成的列表比应有的长度长

如何构造for循环以给出正确的输出?生成的列表比应有的长度长
EN

Stack Overflow用户
提问于 2020-07-12 06:57:43
回答 3查看 43关注 0票数 0

我有两个列表(tb_shadetb_sun),我试图遍历它们,如果满足条件,则将1附加到第三个列表(activity_status),如果不满足,则附加0tb_shadetb_sun列表的长度相同(8760)。我正在尝试创建第三个长度相同的列表(activity_status),如果tb_shadetb_sun列表中的任何一个值超出数值范围: 29-39,则该列表的值为0;如果两个值都在该范围内,则该列表的值为1。我已经尝试了几种不同的方法。我在下面列出了其中的两个尝试。两者都不起作用。

第一次尝试为列表中的所有行附加0,即使我知道有时会满足条件。第二次尝试的输出activity_status列表长度为122268322个值。它应该与tb_suntb_shade列表相同,这两个列表都是8760。有人知道怎么让它运行吗?如有任何帮助或建议,我们将不胜感激!谢谢!

第一次尝试

代码语言:javascript
复制
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)

第二次尝试

代码语言:javascript
复制
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 
EN

回答 3

Stack Overflow用户

发布于 2020-07-12 07:11:40

你的第二次尝试几乎是正确的。您已经嵌套了for循环,所以您实际要做的就是遍历tb_sun 8760次,并将每个数组中的每个值相互比较。试试这个:

代码语言:javascript
复制
activity_status=[]    
for i in range(len(tb_shade)):
    
    if tb_shade[i] > 39 or tb_sun[i] < 29:
        activity_status.append(0)
    if tb_shade[i] < 39 or tb_sun[i] > 29:
        activity_status.append(1)

print(len(activity_status))
print(len(tb_shade))
票数 1
EN

Stack Overflow用户

发布于 2020-07-12 07:36:19

你在一个迭代中使用了一个迭代,这给了你期望结果的平方。也就是说,它不是只从0到8759计数,而是从0到8759循环8760次。

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

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

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2020-07-12 07:09:37

使用列表理解,如果表tb_shade和tb_sun中的值在29,39范围内,则该项为1。否则,该项为0。

代码语言:javascript
复制
activity_status = [1 if (29 <= shade <= 39 and 29 <= sun <= 39) else 0 for shade, sun in zip(tb_shade, tb_sun)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62855445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档