Почему метод extend, не работает в коде в одну строку?
Пример рабочего кода:
n = int(input())
x = []
for i in range(n):
x.extend(input()) ##input() for k in range(n) ---- НЕ РАБОТАЕТ, ПОЧЕМУ?
print(x)
Почему код не работает если использовать:
n = int(input())
x = []
print(x.extend(input() for k in range(n)) ## ---- НЕ РАБОТАЕТ, ПОЧЕМУ?
При таком использовании метода, мы получаем целые слова в списке, как будто использовали append.
Ответы (2 шт):
Можно сделать так, чтобы работало. Для того, чтобы extend "разобрал" аргумент по символам во втором примере, как ни парадоксально, нужно сначала склеить строки из инпутов.
Суть особенности в следующем. Когда в extend подается строка, он ее рассматривает как iterable (последовательность символов). Если же в качестве аргумента заходит последовательность строк, то extend считает каждый элемент этой последовательности неделимым элементом, поэтому на символы дальше не режет. Или, если проще, extend разрезает последовательности только на 1 уровень в глубину.
Объединив строки join-ом, мы создаем последовательность из символов (а не строк), которая "распускается" extend-ом на символы и присоединяется к списку.
n = int(input())
x = []
x.extend(''.join(input() for k in range(n)))
print(x)
3
dflndfd
dfsdfdfsd
fsfsdfsd
['d', 'f', 'l', 'n', 'd', 'f', 'd', 'd', 'f', 's', 'd', 'f', 'd', 'f', 's', 'd', 'f', 's', 'f', 's', 'd', 'f', 's', 'd']
Дополнительно. Если задача только в том, чтобы сделать список символов из введенных строк, то можно обойтись без extend:
n = int(input())
x = list(''.join(input() for k in range(n)))
print(x)
Сначала приведу маленько измененный код, который работает:
n = int(input())
x = []
(x.extend(input() for k in range(n)))
print(x)
Теперь объяснение:
Метод .extend() не возвращает расширенный список, как бы вы могли думать, а значение None.
Такое поведение в Питоне принято для всех стандартных методов, которые прямо меняют свой объект («на месте», «in-place»). Они все возвращают None.
Значит, когда вы применили команду
print(x.extend(...))
тогда вне зависимости, что написано во внутренних скобках, результатом будет print(None) и на экране ничего не появится.