Питон, вопрос по конструкции 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 шт):
Начнём с того, что ошибка:
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. Как по мне, на строчках лучше не экономить. Явное лучше запутанного, пусть и будет больше кода.
Можно и покороче.
numbers=input().split(' ')
del numbers[len(numbers) + len(numbers)%2 - 1:]
print(numbers)