Питон, вопрос по конструкции if

numbers=input().split(' ') 

del numbers[-1] if len(numbers)%2==0 else False 

print(numbers)

При вводе: 1 2 3 4 5, выдаёт ошибку в районе конструкции if:

SyntaxError: cannot delete conditional expression.

Почему так и как это фиксить?

И доп вопрос: чем заполнить пустующий else, или есть возможность не писать его вообще?

Решения в несколько строк, естественно, не предлагать.


Ответы (2 шт):

Автор решения: Amgarak

Начнём с того, что ошибка:

SyntaxError: cannot delete conditional expression

Если её перевести, то становиться очевидным, что нельзя удалять условное выражение через del. ?

Если проще, то del предназначен для удаления переменной и его нельзя применять к тому что возвращает тернарный оператор. Для удаления нужно указать конкретный объект (переменную).


Так что если хочется использовать тернарное выражение, то его результат надо будет сохранить:

numbers="1 2 3 4 5 6".split(' ') 

numbers = numbers[:-1] if len(numbers) % 2 == 0 else numbers
print(numbers)

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


Или сделать вот такую конструкцию:

numbers.pop(-1) if len(numbers) % 2 == 0 else None
print(numbers)

Метод pop() удалит элемент на основе переданного индекса. Но без else не обойтись (он обязателен, потому что тернарное выражение всегда должно возвращать значение) и придётся писать None.

Синтаксис тернарного оператора:

[если истина] if [выражение] else [если ложь]


Так же можно просто воспользоваться обычным условием и записать всё в одну строку:

if len(numbers) % 2 == 0: numbers.pop(-1)
print(numbers)

Можно воспользоваться и альтернативным решением:

len(numbers) % 2 == 0 and numbers.pop(-1)
print(numbers)

Здесь and выполняет pop(-1), только если условие истинна.


Мне так же понравилась идея Serge3leo:

del numbers[(_:= len(numbers)) - 1 + _ % 2:]
print(numbers)

Обычно срез возвращает копию списка, но в контексте оператора del происходит удаление элементов среза в оригинальном списке, вместо создания новой копии.

Вывод:

['1', '2', '3', '4', '5']

[Program finished]

P.S. В методе pop() аргумент не является обязательным. Значение по умолчанию равно -1, поэтому по умолчанию будет удален последний элемент. В примере добавил pop(-1) для наглядности, но это не является ошибкой.

P.S.S. Как по мне, на строчках лучше не экономить. Явное лучше запутанного, пусть и будет больше кода.

→ Ссылка
Автор решения: Serge3leo

Можно и покороче.

numbers=input().split(' ') 

del numbers[len(numbers) + len(numbers)%2 - 1:] 

print(numbers)
→ Ссылка