Методы append() и extend() в Python: добавляем элементы в список
Учимся работать со списками с помощью встроенных функций языка.


Иллюстрация: Катя Павловская для Skillbox Media

Дмитрий Зверев
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
Методы append() и extend() позволяют добавить новый элемент в уже существующий список или объединить несколько list-объектов в один. В этой статье мы расскажем и покажем на примерах, как ими пользоваться. А в конце — поделимся менее очевидными способами расширения списков.
Что делает append() в Python
append() добавляет в конец списка элемент, переданный ему в качестве аргумента. Как и все методы в Python, он вызывается через оператор . (точка).
Синтаксис и возвращаемое значение
list.append(item)
append() принимает один аргумент item и добавляет его в конец list. Тип параметра может быть любым: числа, строки, словари и так далее. Метод возвращает объект None — то есть ничего.
Примеры использования append()
Допустим, у нас есть список a, который заполнен строками:
a = ['car', 'top', 'lot']
Если мы захотим добавить в него новую строку ‘row’, то передадим её в качестве аргумента в append(). Так как метод принадлежит типу list, то вызывать его нужно для объекта a через точку:
a.append('row') print(a) ['car', 'top', 'lot', 'row']
Строка добавилась в конец нашего списка. Всё работает.
Усложним задачу и попробуем добавить ещё один список из двух строк:
b = ['moon', 'sun'] a.append(b) print(a) ['car', 'top', 'lot', 'row', ['moon', 'sun']]
Как мы видим, в a добавился список b с вложенными в него элементами. А если мы захотим, чтобы элементы из b добавились отдельно? Вот так:
['car', 'top', 'lot', 'row', 'moon', 'sun']
К сожалению, с помощью append() этого сделать нельзя, потому что метод принимает только один аргумент. Если вы всё-таки попытаетесь передать несколько объектов через запятую, то интерпретатор вызовет исключение TypeError (ошибка типа):
a = [1, 2, 3] a.append(1, 2, 3) Traceback (most recent call last): File "", line 1, in TypeError: list.append() takes exactly one argument (3 given)
К счастью, есть метод extend(), который позволяет добавить одновременно несколько элементов. О нём и поговорим далее.
Что делает extend() в Python
extend() принимает в качестве параметра итерируемый объект и объединяет его со списком.
Синтаксис и возвращаемое значение
list.extend(iterable)
extend() добавляет новые элементы в конец списка, но, в отличие от append(), принимает в качестве параметров итерируемые объекты: списки, кортежи и строки. При этом объединяемые списки могут содержать элементы любых типов: например, вы можете объединить строки с числами или числа с кортежами.
Как и append(), метод возвращает объект None.
Примеры использования extend()
Вернёмся к нашему списку a:
a = ['car', 'top', 'lot']
Допустим, мы хотим соединить его с другим списком из строк. Передадим b в extend() и получим результат:
b = ['dog', 'cat'] a.extend(b) print(a) ['car', 'top', 'lot', 'dog', 'cat']
Как видите, каждый элемент из b по отдельности добавился в a.
Мы можем сделать то же самое и с другим итерируемыми объектами — например, кортежами или строками:
c = ('like', 'mode') a.extend(c) print(a) ['car', 'top', 'lot', 'dog', 'cat', 'like', 'mode'] d = 'man' a.extend(d) print(a) ['car', 'top', 'lot', 'dog', 'cat', 'like', 'mode', 'm', 'a', 'n']
Обратите внимание: строки, которые передаются в extend(), превращаются в списки символов и добавляются посимвольно. Так, строка ‘man’ разложилась на ‘m’, ‘a’, ‘n’.
Если передать в extend() не итерируемый объект, например число, Python генерирует TypeError:
a = [1, 2, 3] a.extend(1) Traceback (most recent call last): File "", line 1, in module> TypeError: 'int' object is not iterable
В сообщении нам вежливо объясняют, что число — это не итерируемый объект.
Как ещё можно добавить элементы в список
Чтобы упростить жизнь питонистам, разработчики языка добавили пару фич, которые помогают быстро добавлять элементы в списки.
Оператор +. Он напоминает обычный математический оператор, но со списками действует как функция extend():
a = [2, 3] b = [1, 4] a += b print(a) [2, 3, 1, 4]
Все элементы одного списка добавились в конец другого.
Срезы. Ещё один способ добавить элементы в список — нестандартно использовать индексацию. Выглядит это так:
a = [2, 3] b = [1, 4] a[len(a):] = b print(a) [2, 3, 1, 4]
Выглядит немного странно, но это действительно работает. Когда мы пытаемся обратиться к несуществующим элементам a, язык добавляет новые элементы из списка b, ссылку на который мы передали справа от оператора присваивания.
Что запомнить
- Функция append() позволяет добавлять в список один новый элемент — например, число, строку или другой список.
- Функция extend() работает как append(), но в качестве параметра принимает итерируемый объект: список, кортеж или строку. Содержимое этого объекта поэлементно добавляется в другой список.
- Кроме методов append() и extend() добавить элементы в список можно с помощью оператора + и срезов. Оба способа действуют как extend() — поочерёдно добавляют элементы одного списка в другой.
Больше интересного про код в нашем телеграм-канале. Подписывайтесь!
Читайте также:
- Как изучить Python самостоятельно и бесплатно: алгоритм
- «Сменил профессию, пока не стало поздно»: зачем киберполицейский пошёл в айтишники
- Как работает рекурсия функции: объясняем на примере Python
Методы списка
В Python у списков имеется одиннадцать методов. Условно разделим их на группы:
- увеличивающие количество элементов — append , extend , insert
- уменьшающие количество элементов — clear , pop , remove
- изменяющие порядок элементов — reverse , sort
- методы «поиска» — index , count
- копирование списка — copy
Методы append и extend производят добавление в конец списка. Разница между ними заключается в том, что с помощью append можно добавить только один элемент, в то время extend позволяет расширить список сразу на несколько. При этом оба метода принимают один аргумент. В случае extend это должна быть итерируемая последовательность (кортеж, список, строка и другое), каждый элемент которой станет отдельным элементом списка.
>>> lst = ['a', 45, 89, 'who'] >>> lst.append(67) >>> lst ['a', 45, 89, 'who', 67]
>>> b [1, 2, 3] >>> c = (9, 10) >>> b.extend(c) >>> b [1, 2, 3, 9, 10] >>> b.extend("abc") >>> b [1, 2, 3, 9, 10, 'a', 'b', 'c'] >>> b.extend([12, 19]) >>> b [1, 2, 3, 9, 10, 'a', 'b', 'c', 12, 19]
Если требуется вставить элемент в произвольное место списка, используется метод insert . Он принимает два аргумента: сначала индекс, потом значение. Вставка элемента происходит перед элементом, который до этого занимал указанную позицию.
>>> lst.insert(0,10) >>> lst [10, 'a', 45, 89, 'who', 67, 'a1', (1, 2, 3)] >>> lst.insert(len(lst),10) >>> lst [10, 'a', 45, 89, 'who', 67, 'a1', (1, 2, 3), 10] >>> lst.insert(3, 10) >>> lst [10, 'a', 45, 10, 89, 'who', 67, 'a1', (1, 2, 3), 10]
Для удаления из списка одного элемента используют методы remove и pop . Метод remove принимает значение удаляемого элемента, и удаляет первое его вхождение. Если элемента нет в списке, возникает исключение ValueError . Метод pop удаляет элемент по индексу. При этом возвращает удаленное из списка значение в программу. Вызов pop() без аргументов удаляет и возвращает последний элемент. Метод pop генерирует исключение IndexError , если указан индекс за пределами диапазона индексов списка.
lst = [4, 3, 5, 1, 8, 1] d = int(input()) try: lst.remove(d) except ValueError: print('No the item') print(lst)
1 [4, 3, 5, 8, 1]
2 No the item [4, 3, 5, 1, 8, 1]
lst = ['a', 'f', 'b', 'x', 'y', 'k'] i = int(input()) try: value = lst.pop(i) except IndexError: value = 'Index Error' print(value)
10 Index Error
Метод clear удаляет все элементы из списка.
>>> a = [1, 2] >>> a.clear() >>> a []
Метод reverse изменяет порядок элементов на обратный. Метод переворачивает список на месте, то есть тот, к которому применяется.
>>> lst ['a', 10, 89, 'who', 67, 'a1', (1, 2, 3), 10] >>> lst.reverse() >>> lst [10, (1, 2, 3), 'a1', 67, 'who', 89, 10, 'a']
Метод sort выполняет сортировку списка на месте (список изменяется, а не возвращается новый). Если sort() вызывается без аргументов, сортировка происходит по возрастанию. Для сортировки по убыванию следует именованному параметру reverse присвоить True .
>>> li = [4, 1, 9, 5] >>> li.sort() >>> li [1, 4, 5, 9]
>>> st = [4, 2, 7, 5] >>> st.sort(reverse=True) >>> st [7, 5, 4, 2]
Для более сложных сортировок используется параметр key , которому присваивается функция, выполняющая действия над каждым элементом списка. Сортировка происходит на основе вернувшихся значений. Подробнее об этом в этой статье.
>>> n = [-4, 3, 9, -5, 2] >>> n.sort(key=lambda i: abs(i)) >>> n [2, 3, -4, -5, 9]
Метод count считает, сколько раз в списке встречается переданный аргумент.
>>> a = [1, 0, 1, 1, 0] >>> a.count(1) 3
Метод index возвращает индекс указанного элемента. Если таких значений несколько, метод вернет индекс только первого. Если таких элементов нет, генерируется исключение. Вторым и третьим аргументом можно указать срез для поиска.
>>> a = ['a', 'c', 'e', 'a', 'b'] >>> a.index('a') 0 >>> a.index('a', 2) 3 >>> a.index('a', 2, 4) 3 >>> a.index('a', 2, 3) Traceback (most recent call last): File "", line 1, in ValueError: 'a' is not in list
Метод copy создает поверхностную копию списка. Так при наличии вложенных списков копируются не они сами, а ссылки на них. В результате изменение вложенных списков через список-оригинал будет видно также в списке-копии.
>>> a = [1, 2] >>> b = a.copy() >>> b.append(3) >>> a [1, 2] >>> b [1, 2, 3]
>>> c = [1, 2, [3, 4]] >>> d = c.copy() >>> d.append(5) >>> c[2].append(6) >>> c [1, 2, [3, 4, 6]] >>> d [1, 2, [3, 4, 6], 5]
Основы работы со строками в C++
В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.
Строки можно объявлять и одновременно присваивать им значения:
string S1, S2 = «Hello»;
Строка S1 будет пустой, строка S2 будет состоять из 5 символов.
К отдельным символам строки можно обращаться по индексу, как к элементам массива или C-строк. Например S[0] — это первый символ строки.
Для того, чтобы узнать длину строки можно использовать метод size() строки. Например, последний символ строки S это S[S.size() — 1 ].
Строки в языке C++ могут
Конструкторы строк
Строки можно создавать с использованием следующих конструкторов:
string() — конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) — копия строки S
string( size_t n, char c) — повторение символа c заданное число n раз.
string(size_t c) — строка из одного символа c .
string(string & S, size_t start, size_t len) — строка, содержащая не более, чем len символов данной строки S , начиная с символа номер start .
Конструкторы можно вызывать явно, например, так:
В этом примере явно вызывается конструктор string для создания строки, состоящей из 10 символов ‘z’ .
Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:
Подробней о конструкторах для строк читайте здесь.
Ввод-вывод строк
Строка выводится точно так же, как и числовые значения:
Для считывания строки можно использовать операцию «>>» для объекта cin:
В этом случае считывается строка из непробельных символов, пропуская пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова, или чтобы читать данные до конца файла при помощи while (cin >> S) .
Можно считывать строки до появления символа конца строки при помощи функции getline. Сам символ конца строки считывается из входного потока, но к строке не добавляется:
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= — присваивание значения.
+= — добавление в конец строки другой строки или символа.
+ — конкатенация двух строк, конкатенация строки и символа.
== , != — посимвольное сравнение.
< , >, = — лексикографическое сравнение.
То есть можно скопировать содержимое одной строки в другую при помощи операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2, сравнить строки в лексикографическом порядке при помощи S1 < S2, или сделать сложение (конкатенацию) двух строк в виде S = S1 + S2.
Подробней об операторах для строк читайте здесь.
Методы строк
У строк есть разные методы, многие из них можно использовать несколькими разными способами (с разным набором параметров).
Рассмотрим эти методы подробней.
size
Метод size() возращает длину длину строки. Возвращаемое значение является беззнаковым типом (как и во всех случаях, когда функция возращает значение, равное длине строке или индексу элемента — эти значения беззнаковые). Поэтому нужно аккуратно выполнять операцию вычитания из значения, которое возвращает size(). Например, ошибочным будет запись цикла, перебирающего все символы строки, кроме последнего, в виде for (int i = 0; i < S.size() - 1; ++i).
Кроме того, у строк есть метод length(), который также возвращает длину строки.
Подробней о методе size.
resize
S.resize(n) — Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде S.resize(n, c) , где c — символ, то при увеличении длины строки добавляемые символы будут равны c.
Подробней о методе resize.
clear
S.clear() — очищает строчку, строка становится пустой.
Подробней о методе clear.
empty
S.empty() — возвращает true, если строка пуста, false — если непуста.
Подробней о методе empty.
push_back
S.push_back(c) — добавляет в конец строки символ c, вызывается с одним параметром типа char.
Подробней о методе push_back.
append
Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова.
S.append(n, c) — добавляет в конец строки n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.append(T) — добавляет в конец строки S содержимое строки T. T может быть объектом класса string или C-строкой.
S.append(T, pos, count) — добавляет в конец строки S символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе append.
erase
S.erase(pos) — удаляет из строки S с символа с индексом pos и до конца строки.
S.erase(pos, count) — удаляет из строки S с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе erase.
insert
Вставляет в середину строки несколько символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первым параметром является значение i — позиция, в которую вставляются символы. Первый вставленный символ будет иметь индекс i, а все символы, которые ранее имели индекс i и более сдвигаются вправо.
S.insert(i, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.insert(i, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.
S.insert(i, T, pos, count) — вставить символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе insert.
substr
S.substr(pos) — возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки.
S.substr(pos, count) — возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().
Подробней о методе substr.
replace
Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первыми двумя параметрами являются два числа: pos и count. Из данной строки удаляется count символов, начиная с символа pos, и на их место вставляются новые символы.
S.replace(pos, count, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.
S.replace(pos, count, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.
S.replace(pos, count, T, pos2, count2) — вставить символы строки T начиная с символа с индексом pos количеством count.
Подробней о методе replace.
find
Ищет в данной строке первое вхождение другой строки str. Возвращается номер первого символа, начиная с которого далее идет подстрока, равная строке str. Если эта строка не найдена, то возвращается константа string::npos (которая равна -1, но при этом является беззнаковой, то есть на самом деле является большим безннаковым положительным числом).
Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.
S.find(str, pos = 0) — искать первое входение строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.
S.find(str, pos, n) — искать в данной строке подстроку, равную первым n символам строки str. Значение pos должно быть задано.
Подробней о методе find.
rfind
Ищет последнее вхождение подстроки («правый» поиск). Способы вызова аналогичны способам вызова метода find.
Подробней о методе rfind.
find_first_of
Ищет в данной строке первое появление любого из символов данной строки str. Возвращается номер этого символа или значение string::npos.
Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.
S.find_first_of(str, pos = 0) — искать первое входение любого символа строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.
find_last_of
Ищет в данной строке последнее появление любого из символов данной строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
Подробней о методе find_last_of.
find_first_not_of
Ищет в данной строке первое появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
find_last_not_of
Ищет в данной строке последнее появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
c_str
Возвращает указать на область памяти, в которой хранятся символы строки, возвращает значение типа char*. Возвращаемое значение можно рассматривать как C-строку и использовать в функциях, которые должны получать на вход C-строку.
Подробней о методе c_str.
Существует ли аналог append в си?
Хотел узнать насчет того, есть ли какая нибудь функция, которая отправляет переменную в массив(не копирует). Например у меня есть массив строк char* words[] = <"Lord", "Exame", etc>и есть какая нибудь строка char word[5] = «exit» . Как можно отправить это слово в массив words, не копируя его туда или не используя библиотеку ?"Lord",>
Отслеживать
задан 1 апр 2022 в 19:24
121 10 10 бронзовых знаков
words[i] = word;
1 апр 2022 в 21:39
массив это тип с фиксированным размером. есть вариант при создании данного массива использовать большой размер сразу. и использовать вспомогательную переменную, в которой хранить количество реальных данных в массиве. что такое у вас отправляет/не копирует?
2 апр 2022 в 10:42
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- c
- массивы
- строки