Добавить список во вложенном цикле for - PullRequest
0 голосов
/ 26 ноября 2018

Я определил некоторые данные, которые добавляются в некоторые списки.чтобы сделать это, мне нужно поместить их в некое условие вложенного цикла.Сначала создается диапазон от 1 до 15, затем вычисляется повторное число, в цикле я устанавливаю эти условия при совпадении n <= rebarnumber, *do something*, затем продолжаю при n >= rebarnumber do something else.Проблема в том, что когда вышеуказанные условия выполнены, я получаю только список с полной длиной номера диапазона.

Но вместо этого получает этот результат.

[49.0] 1
[49.0, 49.0] 2
[49.0, 49.0, 49.0] 3
[49.0, 49.0, 49.0, 49.0] 4
[49.0, 49.0, 49.0, 49.0, 49.0] 5
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0] 6
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0] 7
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0] 8
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 9
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 10
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 11
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 12
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 13
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 14
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 15

Желаемый результат (только что показаны последние 2 строки печати)

[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0] 14
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0] 15

Код:

h = 300
cb = 35
ct = 35
ca = 35
b= 300
y = 12
d = h - cb
ds = ct
a = 25
yb = 8
rebarnumber = math.floor((b-(2*cb+2*yb+y))/a)
disc = []
dis = []
Asi = []
Asci = []

for n in range(1,16):
    if n <= rebarnumber+1:
        Asi.append(int(3.1416/4*(y)**2))
        dis.append( h - (cb + yb + y/2 ))
        Asci.append(int(3.1416/4*(y)**2))
        disc.append( ct + yb + y/2 )
        if n >= rebarnumber:
            Asi.append(int(3.1416/4*(y)**2))
            dis.append( h - (cb + yb + y/2 ) - ca)
            Asci.append(int(3.1416/4*(y)**2))
            disc.append( cb + yb + y/2 + ca)
    print(disc, n)

Что я не так делаю ?!любая помощь!

1 Ответ

0 голосов
/ 26 ноября 2018

В вашем коде есть несколько неловких вещей.Давайте сначала разберемся с ними.

  1. Вы очевидно импортировали math, так как используете math.floor.Почему бы не использовать math.pi вместо 3.1416?И, поскольку это константа, почему бы не использовать стандартное соглашение об именах PEP8, ALL_CAPS?Кроме того, почему бы не использовать:

    import math
    
    # ...
    
    PI_Y2_4 = int((math.pi * y ** 2) / 4)
    
  2. Есть несколько «общих подвыражений», которые вы можете сохранить как переменные.Поскольку в вашем примере кода они кажутся константами, вы можете даже сделать их константамиНо даже если они не являются постоянными в вашем реальном коде, вы можете добиться ясности, избежать ошибок и повысить скорость, вычислив их всего один раз:

    for n in range(1, 16):
        cbyby_2 = cb + yb + y / 2
        ctyby_2 = ct + yb + y / 2
    
        if n <= rebarnumber+1:
            Asi.append(PI_Y2_4)
            Asci.append(PI_Y2_4)
            dis.append(h - cbyby_2)
            disc.append(ctyby_2)
    
            if n >= rebarnumber:
                Asi.append(PI_Y2_4)
                Asci.append(PI_Y2_4)
                dis.append(h - cbyby_2 - ca)
                disc.append(cbyby_2 + ca)
    

    Кроме того, вы уверены в ct и cb при вычислении значений для disc?Все остальное остается прежним, но эти два меняются.Может быть, это опечатка?

Теперь, когда эти проблемы не нужны, давайте посмотрим на ваши примеры «получил» и «хотел».Вы «получили» кучу списков, которые перестают расти на n == 9.Вы «хотели» кучу списков, которые продолжали расти (на один) до n == 15.

Глядя на форму вашего кода, я вижу это:

for ...:
    if ...
        if ...
    print()

Это говоритоператор print будет происходить каждый раз, но методы append будут вызываться только при прохождении первого оператора if.Кроме того, поскольку второй оператор if содержится в первом операторе if, когда этот оператор проходит, вы добавляете дважды к каждому списку.

Очевидно, это не то, что вы хотите.Вместо этого я подозреваю, что вы пытаетесь сделать серию if/else, где один набор поведения относится к 8 или 9, а затем вступает в действие другой набор поведения.

Поскольку вы упомянули else в комментарии, я предполагаю, что это домашнее задание или что-то, что вы еще не изучили else.

В этом случае вам необходимо убедиться, что ваши условия прямо противоположны друг другу!Самый простой способ сделать это - использовать not.(Обратите внимание, что два оператора if имеют отступ в одинаковую сумму! Второй if не содержится внутри первого.):

for n in ...:
    ...
    low_rebar = (n <= rebarnumber + 1)

    if low_rebar:
        Asi.append(PI_Y2_4)
        Asci.append(PI_Y2_4)
        dis.append(h - cbyby_2)
        disc.append(ctyby_2)

    if not low_rebar:
        Asi.append(PI_Y2_4)
        Asci.append(PI_Y2_4)
        dis.append(h - cbyby_2 - ca)
        disc.append(cbyby_2 + ca)

    print(disc, n)

Если вы не использовали логические выражения, вы не можетеудобно хранить результат в переменной.В этом случае вы можете записать это:

    if n <= rebarnumber + 1:
        ...
    if not (n <= rebarnumber + 1):
        ...

Или вы можете математически изменить условие:

    if n > rebarnumber + 1:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...