Как структурировать l oop, чтобы получить правильный результат? Созданный список длиннее, чем должен быть - PullRequest
0 голосов
/ 12 июля 2020

У меня есть два списка (tb_shade и tb_sun), которые я пытаюсь перебрать и добавить 1 в третий список (activity_status), если критерий соблюден, или 0, если не. Списки tb_shade и tb_sun имеют одинаковую длину (8760). И я пытаюсь создать третий список (activity_status) такой же длины и со значением 0, если одно из значений списков tb_shade или tb_sun находится за пределами числовых значений. c диапазон: 29–39 или 1, если любое из значений находится в этом диапазоне. Я пробовал это несколькими разными способами. Я включил две из этих попыток ниже. Ни один из них не работает.

Первая попытка добавляет 0 для всех строк в списке, хотя я знаю, что критерии соблюдены в некоторых случаях. При второй попытке выводится список activity_status, состоящий из 122268322 значений. Он должен быть таким же, как списки tb_sun и tb_shade, которые оба относятся к 8760. Кто-нибудь знает, как это запустить? Любая помощь или подсказка будут оценены! Спасибо!

Первая попытка

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 

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Ваша вторая попытка почти верна. У вас есть вложенные циклы for, поэтому на самом деле вы перебираете tb_sun 8760 раз и сравниваете каждое значение в каждом массиве друг с другом. Попробуйте это:

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 голос
/ 12 июля 2020

Вы используете итерацию с в итерации, и это дает вам квадрат ожидаемого результата. т.е. вместо того, чтобы считать только от 0 до 8759, он выполняет цикл от 0 до 8759 8760 раз.

Вместо этого вы можете использовать один для l oop и использовать его для итерации обоих списков.

Во-вторых, ваши критерии не исключают друг друга из того, что вы написали. Например, если два числа из 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 
0 голосов
/ 12 июля 2020

Используя понимание списка, элемент равен 1, если значения в таблице tb_shade и tb_sun находятся в пределах диапазона [29, 39]. В противном случае элемент равен 0.

activity_status = [1 if (29 <= shade <= 39 and 29 <= sun <= 39) else 0 for shade, sun in zip(tb_shade, tb_sun)]
...