#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]