В чем разница между extend и append?
Я немного не понимаю в чем разница между append и extend в структурах данных, на конкретной ситуации.
a = [1] a.append(a) print(a) #[1, [. ]]
a = [1] a.extend(a) print(a) #[1, 1]
a = 1, a += a print(a) #(1, 1)
Как я понимаю в первом случае я создаю список, в него засовываю его же, но так как он уже изменился, и айди осталось то же, то ему придется себя еще раз изменить рекурсивно и так далее. В третьем мы изменяем кортеж, но изменяем его айди и соответсвенно, тот кортеж уже не тот, что после. Но что во втором не так?
Отслеживать
задан 28 июн 2022 в 19:10
19 6 6 бронзовых знаков
Подтверждаю, абсолютно тождественный результат. Вопрос — откуда ТС взял результат первого примера. Вернее так: результат предъявленный ТС может получиться в случае использования конструкции a.extend([a])
28 июн 2022 в 19:21
В первом случае список содержит ссылку на себя самого в качестве одного из элементов. Еще раз для этого ничего менять не придется. Разницы между этим списком и списком, содержащим ссылку на другой список, практически нет. А вот при выводе такого списка можно уйти в бесконечную рекурсию. Чтобы этого избежать, библиотечная функция просто выводит троеточие.
28 июн 2022 в 19:45
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
a.append(x) тупо берет элемент x как есть и добавляет его в список a. x может быть что угодно, оно просто добавится в список. Если x список, то в a добавится один элемент — список x. А в extend нужно передавать итератор, который поэлементно добавится в список.
Отслеживать
ответ дан 28 июн 2022 в 19:44
Олег Плюснин Олег Плюснин
76 2 2 бронзовых знака
a.extend(a)
Это полностью эквивалентно коду:
for x in a.copy(): a.append(x)
И при этом совершенно не важно, что находится в a , главное чтобы по этому можно было проитерироваться, ну и чтобы a.append работало.
Update: Поставил a.copy() , extrn прав, вот не проверишь код — и окажется какая-нибудь засада.
Метод append() и extend() в Python
Метод append() в Python добавляет элемент в конец списка.
list.append(item)
Параметры
Метод принимает единственный аргумент:
- item – элемент, который нужно добавить в конец списка.
Элементом могут быть числа, строки, словари, другой список и т.д.
Возвращаемое значение
Метод не возвращает никакого значения (возвращает None).
Пример 1: Добавление элемента в список
# animals list animals = ['cat', 'dog', 'rabbit'] # 'guinea pig' is appended to the animals list animals.append('guinea pig') # Updated animals list print('Updated animals list: ', animals)
Updated animals list: ['cat', 'dog', 'rabbit', 'guinea pig']
Пример 2: Добавление списка в список
# animals list animals = ['cat', 'dog', 'rabbit'] # list of wild animals wild_animals = ['tiger', 'fox'] # appending wild_animals list to the animals list animals.append(wild_animals) print('Updated animals list: ', animals)
Updated animals list: ['cat', 'dog', 'rabbit', ['tiger', 'fox']]
Важно отметить, что в список животных в приведенной выше программе добавляется один элемент (список wild_animals).
Если вам нужно добавить элементы списка в другой список (а не в сам список), используйте метод extend().
list1.extend(iterable)
При этом все элементы Iterable добавляются в конец list1.
Параметры
Как уже упоминалось, метод принимает итерацию, такую как список, кортеж, строка и т.д.
Возвращаемое значение
Метод изменяет исходный список, он не возвращает никакого значения.
Пример 1: Использование метода
# language list language = ['French', 'English'] # another list of language language1 = ['Spanish', 'Portuguese'] # appending language1 elements to language language.extend(language1) print('Language List:', language)
Language List: ['French', 'English', 'Spanish', 'Portuguese']
Пример 2: Добавить элементы кортежа и установить их в список
# language list language = ['French'] # language tuple language_tuple = ('Spanish', 'Portuguese') # language set language_set = # appending language_tuple elements to language language.extend(language_tuple) print('New Language List:', language) # appending language_set elements to language language.extend(language_set) print('Newer Language List:', language)
New Language List: ['French', 'Spanish', 'Portuguese'] Newer Language List: ['French', 'Spanish', 'Portuguese', 'Japanese', 'Chinese']
Другие способы расширения списка
Вы также можете добавить в список все элементы итерации, используя:
a = [1, 2] b = [3, 4] a += b # a = a + b # Output: [1, 2, 3, 4] print('a =', a)
a = [1, 2, 3, 4]
2. Синтаксис нарезки списка.
a = [1, 2] b = [3, 4] a[len(a):] = b # Output: [1, 2, 3, 4] print('a =', a)
Методы списков Python
Для добавления множества элементов используйте extend() . Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
list.clear( i ) ¶
Удаляет из списка все имеющиеся в нём значения.
my_list = [1, 2, 3]my_list.clear() # Nonemy_list # []
Действие метода эквивалентно выражению del my_list[:] .
list.copy() ¶
Возвращает копию списка. Внимание: Возвращаемая копия является поверхностной (без рекурсивного копирования вложенных элементов).
my_list = [1, 2, 3]my_list_copy = my_list.copy() # [1, 2, 3]my_list # []
Действие метода эквивалентно выражению my_list[:] .
list.count(x) ¶
random_list = [4, 1, 5, 4, 10, 4]random_list.count(4) # 3
Метод count считает количество значений x в списке.
list.extend(iterable) ¶
Дополняет список элементами из указанного объекта.
- it : Объект, поддерживающий итерирование, элементами которого требуется дополнить список.
my_list = []my_list.extend([1, 2, 3]) # Nonemy_list # [1, 2, 3]my_list.extend('add') # Nonemy_list # [1, 2, 3, 'a', 'd', 'd']
Для добавления единственного элемента используйте append() .
Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
list.index(x , start , end ) ¶
Метод возвращает положение первого индекса, со значением х . Также можно указать границы поиска start и end .
list.insert(i, x) ¶
Вставляет указанный элемент перед указанным индексом
- i : Позиция (индекс), перед которой требуется поместить элемент. Нумерация ведётся с нуля. Поддерживается отрицательная индексация.
- x : Элемент, который требуется поместить в список.
my_list = [1, 3] my_list.insert(1, 2)my_list # [1, 2, 3] my_list.insert(-1, 4)my_list # [1, 2, 4, 3]
Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
list.pop( i ) ¶
Возвращает элемент на указанной позиции , удаляя его из списка.
- i=None : Позиция искомого элемента в списке (целое число). Если не указана, считается что имеется в виду последний элемент списка. Отрицательные числа поддерживаются.
my_list = [1, 2, 3, 4, 5]last = my_list.pop() # 5my_list # [1, 2, 3, 4]second = my_list.pop(-3) # 2my_list # [1, 3, 4]first = my_list.pop(0) # 1my_list # [3, 4]
Чтобы удалить элемент из списка не возвращая его, воспользуйтесь list.remove() .
list.remove(x) ¶
Удаляет из списка указанный элемент.
- x : Элемент, который требуется удалить из списка. Если элемент отсутствует в списке, возбуждается ValueError . Удаляется только первый обнаруженный в списке элемент, значение которого совпадает со значением переданного в метод.
my_list = [1, 3] my_list.remove(1)my_list # [3] my_list.remove(4) # ValueError
Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
list.reverse() ¶
Перестраивает элементы списка в обратном порядке.
my_list = [1, 'two', 'a', 4]my_list.reverse() # Nonemy_list # [4, 'a', 'two', 1]
Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
list.sort(key=None, reverse=False) ¶
Сортирует элементы списка на месте.
- key=None : Функция, принимающая аргументом элемент, используемая для получения из этого элемента значения для сравнения его с другими.
- reverse=False : Флаг, указывающий следует ли производить сортировку в обратном порядке.
my_list = [1, 'two', 'a', 4, 'a']# Попытка упорядочить/сравнить несравнимые типы вызовет исключениеmy_list.sort() # TypeError: unorderable types: str() # Отсортируем «вручную», так чтобы 'а' были в конце.my_list.sort(key=lambda val: val == 'a') # None # Фактически мы отсортировали в соответствии # с маской [False, False, False, True, True]my_list # ['two', 4, 1, 'a', 'a']
Внимание: Данный метод модифицирует исходный объект на месте, возвращая при этом None .
Хотите выучить 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]