Как анализировать эти операции через списки?

#python #algorithm

#python #алгоритм

Вопрос:

Описание программы:

Программа принимает список l , содержащий другие списки. Вывод l , в котором списки длиной более 3 будут изменены соответствующим образом: элемент с индексом 3 будет представлять собой сумму удаленных элементов (от третьего до конца).

Мое решение:

 l = [[1,2], [3,4,4,3,1], [4,1,4,5]]
s = 0
for i in range(len(l)-1):
  if len(l[i]) > 3:
      for j in range(3,len(l[i])-1):
        s  = l[i][j]
        l[i].remove(l[i][j])
      l[i].insert(len(l[i]),s)
l
  

Тест:

 Input: [[1,2], [3,4,4,3,1], [4,1,4,5]]
Expected Output: [[1, 2], [3, 4, 8], [4, 1, 9]]
  

Запуск программы:

 Input: [[1,2], [3,4,4,3,1], [4,1,4,5]]
Output: [[1, 2], [4, 4, 3, 1, 3], [4, 1, 4, 5]]
  

Вопрос: Я не понимаю, что может быть источником проблемы в этом случае, почему он должен добавлять некоторые дополнительные числа в конец вместо summ. Я буду признателен за любую помощь.

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

1. l = [li[:2] [sum(li[2:])] if len(li)>2 else li for li in l]

Ответ №1:

remove это неправильная функция. Вместо этого вы должны использовать del . Прочитайте документацию, чтобы понять, почему.

И еще одна ошибка, с которой вы сталкиваетесь, заключается в том, что вы не сбрасываете s . Он должен быть установлен 0 во внешнем цикле for .

Но вы делаете это слишком сложным. Я думаю, лучше показать, как вы можете сделать это действительно легко.

 for e in l:              # No need for range. Just iterate over each element
    if len(e) > 3:
        e[2]=sum(e[2:])  # Sum all the elements
        del(e[3:])       # And remove
  

Или, если вы хотите, чтобы это было как понимание списка, которое создает новый список и не изменяет старый:

 [e[0:2]   [sum(e[2:])] if len(e)>3 else e for e in l]
  

Ответ №2:

Прежде всего, remove() это неправильный метод, поскольку он удаляет по значению, а не по индексу:

Метод списка Python remove() выполняет поиск данного элемента в списке и удаляет первый соответствующий элемент.

Вы хотели бы использовать del или pop() .

Во-вторых, вы не вырезаете все элементы из конца списка, а только одно значение.

Ответ №3:

remove причина, по которой ваш код не работает. (как упоминалось Mat-KH в другом ответе)

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

 func = lambda x: x if len(x) < 3 else x[:2]   [sum(x[2:])]
l = [func(x) for x in l]