1 Вопрос: Перезапуск цикла и редактирование исходного списка, если условие False

вопрос создан в Thu, May 2, 2019 12:00 AM

Я выполняю некоторые операции над списком с циклом for, и мне нужно удалить элементы этого списка, когда условие if не выполнено, а затем снова выполнить операции.

Я видел калькулятор (и здесь ) пример, в котором они используют цикл while но я не смог приспособить это к моей проблеме.

Вот пример того, что я хочу сделать

a = [[9,8,7], [6,5,3,4]] # different length sublists, elements are not repeated
results = [[] for i in range(len(a))]

for i in range(len(a)):   
    for j in range(len(a[i])):
        results[i].append(a[i][j]/4)
# see below for explanation for this step
    for j in range(len(a[i])):
        if results[i][j] <1:
            del a[i][j]
            print('element',j,'removed from sublist',i)
            break
        else:
            continue
# when there is an element that doesn't met the condition I want to remove 
# that element and restart the calculation for that step, in this case i=1 
# but this depends on the list

# The calculation is then done for the list with the element removed
# this is way I'm repeating the code below (which I want to avoid)

results = [[] for i in range(len(a))]
for i in range(len(a)):   
    for j in range(len(a[i])):
        results[i].append(a[i][j]/4)
    for j in range(len(a[i])):
        if results[i][j] <1:
            del a[i][j]
            print('element',j,'removed from sublist',i)
            break
        else:
            continue
print(results)

Некоторые проблемы:

  1. Я не могу проверить значения results для каждого шага j в моем реальном коде, поскольку results[i] - это класс модели, и он выполняется для всех элементов в results[i] одновременно (именно поэтому в цикле используется двойной цикл for).

  2. Я думаю, что код работает так же, как и для этого простого примера, но это может занять много времени для больших списков и более сложных вычислений. Например, если я изменю свой список на a = [[9,8,7], [6,5,3,2,4]], мне нужно будет включить больше для циклов.

  3. Я мог бы использовать что-то вроде range(restart, len(a)) во втором цикле for i, но проблема, связанная с пунктом 2, остается, и он добавит новые результаты к старым, например, results = [[2.25, 2.0, 1.75], [1.5, 1.25, 0.75, 1.0, 1.5, 1.25, 1.0]] вместо results = [[2.25, 2.0, 1.75], [1.5, 1.25, 1.0]].

Есть ли лучший способ сделать это? Может быть, с петлей while? Я был бы в порядке с перезапуском вычисления с i=0, если нет другого способа, и если мне не нужно включать больше циклов for для больших списков с большим количеством элементов.

    
1
  1. Почему вы дважды опубликовали один и тот же код?
    2019-05-02 14: 53: 10Z
  2. @ Шелдор, вы хотите проверить a[i][j]/4<1 перед добавлением результатов? Это объясняется в вопросе, я не могу напрямую проверить, что в реальном коде, так как results является результатом подгонки модели к набору данных. Что касается вашего второго комментария, это часть моей проблемы, когда я впервые сгенерировал новый список, в котором был удален элемент, тогда мне придется снова выполнить расчет для нового списка.
    2019-05-02 15: 07: 02Z
1 ответ                              1                         

Вы повторили код дважды.

Если вы хотите присвоить значение 1 переменной i и перезапустить цикл, то лучше использовать цикл while. Например:

while i <= len(a):

       # your code
       # restar i value when you need it using:
       i = 1;

Я не знаю, когда вы хотите перезапустить значение i, но вы можете попробовать это в своем другом, прежде чем продолжить клаузуле.

i = 1
    
0
2019-05-02 15: 01: 49Z
  1. Я повторил код, чтобы вычисление было выполнено в новом списке. Значение i, где я хочу перезапустить вычисление, будет зависеть от подсписка, который содержит элемент, который не соответствует условию if. Я постараюсь изменить свой вопрос, чтобы сделать его более понятным.
    2019-05-02 15: 12: 56Z
источник размещен Вот