Python возвращает сумму списка, где 5 считается двойным, а число после 5 считается четырехкратным

#python #list #for-loop #if-statement #control-flow

#python #Список #для цикла #if-оператор #поток управления

Вопрос:

Учитывая список, верните сумму всех чисел в списке. Однако, если в списке появляется число 5, вы должны удвоить его, а число, которое сразу же появляется после 5, должно быть увеличено в четыре раза. Итак, следующий список [1, 2, 4, 1, 5, 2] должно вернуться 26, а [5, 1, 6] должно вернуть 20.

Это то, что у меня есть до сих пор:

 def list_sum(x):
    if len(x) == 0:
        return 0
    else:
        sum2 = 0
        for i in x:
            if i == 5:
                sum2  = 5*2
            if x[i - 1] == 5:
                sum2  = i * 4
            else:
                sum2  = i
       
    return sum2
  

Я могу успешно выполнить первую часть задачи, в которой я умножаю любые 5 в списке на 2, но возникают проблемы со второй частью, где я должен попросить код увеличить число, которое идет после 5, в четыре раза. Я думал x[i - 1] == 5 , что в основном будет индексироваться элемент, который идет после 5, но после опробования нескольких операторов печати мне стало известно, что эта строка кода на самом деле ничего не делает… Итак, какие-нибудь советы?

Краткое примечание: для решения этой проблемы используются только циклы и операторы if

Комментарии:

1. if x[i - 1] == 5: это неправильно, вы перебираете элементы своего списка, а не индексы

2. Вы проводили какую-либо отладку? Я бы рекомендовал прочитать ericlippert.com/2014/03/05/how-to-debug-small-programs .

3. Что делать, если в строке два 5 s? Что должно [1, 5, 5] вернуться? 51 ?

4. Вы пытались использовать отдельную переменную, чтобы запомнить, было ли предыдущее значение 5? Когда вы увидите 5, установите его так, чтобы вы могли проверить его на следующей итерации.

Ответ №1:

Попробуйте так (вместо этого выполните итерацию по диапазону длины входного списка:

 mylist = [1, 2, 4, 1, 5, 2] 
def list_sum(thelist):
  sum2 = 0
  for x in range(len(thelist)):
    if thelist[x] == 5:
      sum2  = 5*2
    elif thelist[x-1] == 5:
      sum2  = thelist[x]*4
    else:
      sum2  = thelist[x]
   
  return sum2

print(list_sum(mylist))
  

Комментарии:

1. Я бы ожидал mylist = [1, 5] , что результат 11 будет. Или я что-то упускаю?

2. @MarkMeyer Я тоже это понимаю. При публикации я тестировал с примерами OP, и они работали. У вас есть какие-либо идеи в этом случае?

3. @Wasif Hasan Я отредактировал вашу elif строку elif thelist[x-1] == 5 and not thelist[-1] == 5: , и это устранило проблему. Итак, раньше, если 5 был последним элементом в списке, код будет считать thelist[x-1] , что это первый элемент списка, и он будет увеличен в четыре раза

Ответ №2:

Определите переменную и измените ее при появлении 5

 def list_sum(x):
    IfFive = False
    if len(x) == 0:
        return 0
    else:
        sum2 = 0
        for i in x:
            if i == 5:
                sum2  = 5*2
                IfFive = True
            elif IfFive:
                sum2  = i * 4
                IfFive = False
            else:
                sum2  = i
       
    return sum2
  

Результат:

 print(list_sum([5, 1, 6]))
>>> 20