Как настроить смартфоны и ПК. Информационный портал

Списки (list). Функции и методы списков

Сегодня я расскажу о таком типе данных, как списки , операциях над ними и методах, о генераторах списков и о применении списков.

Что такое списки?

Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться).

Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, ) встроенной функцией list :

>>> list ("список" ) ["с", "п", "и", "с", "о", "к"]

Список можно создать и при помощи литерала:

>>> s = # Пустой список >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok"], 2]

Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.

И еще один способ создать список - это генераторы списков . Генератор списков - способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл .

>>> c = [ c * 3 for c in "list" ] >>> c ["lll", "iii", "sss", "ttt"]

Возможна и более сложная конструкция генератора списков:

>>> c = [ c * 3 for c in "list" if c != "i" ] >>> c ["lll", "sss", "ttt"] >>> c = [ c + d for c in "list" if c != "i" for d in "spam" if d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]

Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков.

Функции и методы списков

Создать создали, теперь нужно со списком что-то делать. Для списков доступны основные , а также методы списков.

Таблица "методы списков"

Метод Что делает
list.append (x) Добавляет элемент в конец списка
list.extend (L) Расширяет список list, добавляя в конец все элементы списка L
list.insert (i, x) Вставляет на i-ый элемент значение x
list.remove (x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует
list.pop ([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
list.index (x, ]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)
list.count (x) Возвращает количество элементов со значением x
list.sort () Сортирует список на основе функции
list.reverse () Разворачивает список
list.copy () Поверхностная копия списка
list.clear () Очищает список

Нужно отметить, что методы списков, в отличие от , изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную.

>>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . sort () >>> l >>> l = l . sort () >>> print (l ) None

И, напоследок, примеры работы со списками:

>>> a = [ 66.25 , 333 , 333 , 1 , 1234.5 ] >>> print (a . count (333 ), a . count (66.25 ), a . count ("x" )) 2 1 0 >>> a . insert (2 , - 1 ) >>> a . append (333 ) >>> a >>> a . index (333 ) 1 >>> a . remove (333 ) >>> a >>> a . reverse () >>> a >>> a . sort () >>> a [-1, 1, 66.25, 333, 333, 1234.5]

Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими

Чтобы ответить на этот вопрос, мне нужно объяснить Unbounded Wildcards и Ограниченные подстановочные знаки.
Содержимое этого сообщения было собрано из java-документации.

1. Неограниченные подстановочные знаки

Безграничный тип подстановок задается с использованием символа подстановки (?), например, List . Это называется списком неизвестного типа. Существует два сценария, в которых неограниченный подстановочный знак - полезный подход:

    Если вы пишете метод, который может быть реализован с использованием функций, предоставляемых в классе Object.

    Когда код использует методы в общем классе, которые не зависят от параметра типа. Например, List.size или List.clear . На самом деле, Class так часто используется, потому что большинство методов из Class не зависят от T .

2. Ограниченные подстановочные знаки

Рассмотрим простое приложение рисования, которое может рисовать фигуры, такие как прямоугольники и круги. Чтобы представить эти формы внутри программы, вы можете определить иерархию классов, такую ​​как:

public abstract class Shape { public abstract void draw(Canvas c); } public class Circle extends Shape { private int x, y, radius; public void draw(Canvas c) { ... } } public class Rectangle extends Shape { private int x, y, width, height; public void draw(Canvas c) { ... } }

Эти классы можно рисовать на холсте:

public class Canvas { public void draw(Shape s) { s.draw(this); } }

Любой рисунок обычно содержит несколько фигур. Предполагая, что они представлены в виде списка, было бы удобно иметь метод в Canvas, который рисует их все:

public void drawAll(List shapes) { for (Shape s: shapes) { s.draw(this); } }

Теперь правила типа говорят, что drawAll() можно вызывать только в списках точно Shape: его нельзя, например, вызывать на List . Это несчастливо, так как весь метод делает, читает фигуры из списка, поэтому его можно так же просто вызвать на List . Мы действительно хотим, чтобы метод принял список любой формы: public void drawAll (формы списка) { ... } Здесь небольшое, но очень важное различие: мы заменили тип List на List . Теперь drawAll() будет принимать списки любого подкласса Shape , поэтому мы можем теперь называть его, если хотим.

List - пример ограниченного шаблона. ? обозначает неизвестный тип, однако в этом случае мы знаем, что этот неизвестный тип на самом деле является подтипом Shape. (Примечание: это может быть сама форма или какой-то подкласс, она не должна буквально расширять форму.) Мы говорим, что Shape является верхней границей подстановочного знака.

Аналогично, синтаксис? super T , который является ограниченным подстановочным знаком, обозначает неизвестный тип, который является супертипом T. A ArrayedHeap280 , например, включает в себя ArrayedHeap280 , ArrayedHeap280 и ArrayedHeap280 . Как вы можете видеть в java-документации для класса Integer , Integer является подклассом Number, который, в свою очередь, является подклассом Object.

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

Что такое список (list) в Python?

Список (list) – это структура данных для хранения объектов различных типов. Если вы использовали другие языки программирования, то вам должно быть знакомо понятие массива. Так вот, список очень похож на массив, только, как было уже сказано выше, в нем можно хранить объекты различных типов. Размер списка не статичен, его можно изменять. Список по своей природе является изменяемым типом данных. Про типы данных можно подробно прочитать . Переменная, определяемая как список, содержит ссылку на структуру в памяти, которая в свою очередь хранит ссылки на какие-либо другие объекты или структуры.

Как списки хранятся в памяти?

Как уже было сказано выше, список является изменяемым типом данных. При его создании в памяти резервируется область, которую можно условно назвать некоторым “контейнером”, в котором хранятся ссылки на другие элементы данных в памяти. В отличии от таких типов данных как число или строка, содержимое “контейнера” списка можно менять. Для того, чтобы лучше визуально представлять себе этот процесс взгляните на картинку ниже. Изначально был создан список содержащий ссылки на объекты 1 и 2, после операции a = 3 , вторая ссылка в списке стала указывать на объект 3.

Создание, изменение, удаление списков и работа с его элементами

Создать список можно одним из следующих способов.

> > > a = > > > type (a) < class "list" > > > > b = list () > > > type (b) < class "list" >

Также можно создать список с заранее заданным набором данных.

> > > a = > > > type (a) < class "list" >

Если у вас уже есть список и вы хотите создать его копию, то можно воспользоваться следующим способом:

> > > a = > > > b = a[:] > > > print (a) > > >

или сделать это так:

> > > a = > > > b = list (a) > > > print (a) > > > print (b)

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

> > > a = > > > b = a > > > print (a) > > > print (b) > > > a = 10 > > > print (a) > > > print (b)

Добавление элемента в список осуществляется с помощью метода append().

> > > a = > > > a.append(3 ) > > > a.append("hello" ) > > > print (a)

Для удаления элемента из списка, в случае, если вы знаете его значение, используйте метод remove(x), при этом будет удалена первая ссылка на данный элемент.

> > > b = > > > print (b) > > > b.remove(3 ) > > > print (b)

Если необходимо удалить элемент по его индексу, воспользуйтесь командой del имя_списка[индекс] .

> > > c = > > > print (c) > > > del c > > > print (c)

Изменить значение элемента списка, зная его индекс, можно напрямую к нему обратившись.

> > > d = > > > print (d) > > > d = 17 > > > print (d)

Очистить список можно просто заново его проинициализировав, так как будто вы его вновь создаете. Для получения доступа к элементу списка укажите индекс этого элемента в квадратных скобках.

> > > a = > > > a 7

Можно использовать отрицательные индексы, в таком случае счет будет идти с конца, например для доступа к последнему элементу списка можно использовать вот такую команду:

> > > a[- 1 ] 0

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

> > > a

Методы списков

list.append(x)

Добавляет элемент в конец списка. Ту же операцию можно сделать так a = [x] .

> > > a = > > > a.append(3 ) > > > print (a)

list.extend(L)

Расширяет существующий список за счет добавления всех элементов из списка L . Эквивалентно команде a = L .

> > > a = > > > b = > > > a.extend(b) > > > print (a)

list.insert(i, x)

Вставить элемент x в позицию i . Первый аргумент – индекс элемента после которого будет вставлен элемент x .

> > > a = > > > a.insert(0 , 5 ) > > > print (a) > > > a.insert(len (a), 9 ) > > > print (a)

list.remove(x)

Удаляет первое вхождение элемента x из списка.

> > > a = > > > a.remove(1 ) > > > print (a)

list.pop([i])

Удаляет элемент из позиции i и возвращает его. Если использовать метод без аргумента, то будет удален последний элемент из списка.

> > > a = > > > print (a.pop(2 )) 3 > > > print (a.pop()) 5 > > > print (a)

list.clear()

Удаляет все элементы из списка. Эквивалентно del a[:] .

> > > a = > > > print (a) > > > a.clear() > > > print (a)

list.index(x[, start[, end]])

Возвращает индекс элемента.

> > > a = > > > a.index(4 ) 3

list.count(x)

Возвращает количество вхождений элемента x в список.

> > > a= > > > print (a.count(2 )) 2

list.sort(key=None, reverse=False)

Сортирует элементы в списке по возрастанию. Для сортировки в обратном порядке используйте флаг reverse=True . Дополнительные возможности открывает параметр key , за более подробной информацией обратитесь к документации.

> > > a = > > > a.sort() > > > print (a)

list.reverse()

Изменяет порядок расположения элементов в списке на обратный.

> > > a = > > > a.reverse() > > > print (a)

list.copy()

Возвращает копию списка. Эквивалентно a[:] .

> > > a = > > > b = a.copy() > > > print (a) > > > print (b) > > > b = 8 > > > print (a) > > > print (b)

List Comprehensions

List Comprehensions чаще всего на русский язык переводят как абстракция списков или списковое включение, является частью синтаксиса языка, которая предоставляет простой способ построения списков. Проще всего работу list comprehensions показать на примере. Допустим вам необходимо создать список целых чисел от 0 до n , где n предварительно задается. Классический способ решения данной задачи выглядел бы так:

N = int (input ()) a = for i in range (n): a.append(i) print (a)

Использование list comprehensions позволяет сделать это значительно проще:

N = int (input ()) a = print (a)

или вообще вот так, в случае если вам не нужно больше использовать n:

A = print (a)

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas . На нашем сайте вы можете найти Все уроки по библиотеке Pandas собраны в книге

Лучшие статьи по теме