Как работать с типом данных списка Python

автор vadim


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

Основы списков Python

Определить список в Python легко — просто используйте синтаксис скобок для обозначения элементов в списке, например:


list_of_ints = [1, 2, 3]

Элементы в списке не обязательно должны быть одного типа; они могут быть любым объектом Python. В приведенном ниже списке предположим Three это функция:


list_of_objects = ["One", TWO, Three, {"Four":4}, None]

Обратите внимание, что смешанные объекты в списке могут повлиять на его сортировку. Мы поговорим об этом позже.

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

в list_of_ints пример, list_of_ints[0] урожайность 1, list_of_ints[1] урожайность 2и list_of_objects[4] было бы None объект.

Индексирование списка Python

Если вы используете для индекса положительное целое число, оно указывает позицию искомого элемента. Но если вы используете отрицательный целое число, тогда целое число указывает позицию, начиная с конец списка. Например, используя индекс -1 — это удобный способ получить последний элемент из списка независимо от его размера.

В таком случае, list_of_ints[-1] урожайность 3и list_of_objects[-1] урожайность None.

Вы также можете использовать целочисленную переменную в качестве индекса. Если x=0, list_of_ints[x] дает 1 и так далее.

Если вы попытаетесь индексировать за пределами списка, вы вызовете ошибку IndexError исключение.

Добавление и удаление элементов списка Python

В Python есть несколько способов добавления или удаления элементов из списка:

  • .append() вставляет элемент в конец списка. Например, list_of_ints.append(4) повернулся бы list_of_ints в список [1,2,3,4]. Добавления выполняются быстро и эффективно; добавление одного элемента в список занимает примерно одинаковое количество времени, независимо от его длины.
  • .extend() берет содержимое некоторого итерируемого объекта (например, другого списка) и добавляет каждый элемент из итерируемого объекта в список как отдельный элемент. Это полезно, если вы хотите быстро вставить содержимое одного элемента списка в другой список. (Если вы попытаетесь .append() один список к другому, весь список добавляется как один объект, а не поэлементно.)
  • .pop() удаляет и возвращает последний элемент из списка. Если бы мы побежали x = list_of_ints.pop() на оригинале list_of_intsx будет содержать значение 3. (Вам не обязательно присваивать результаты .pop() на значение, если оно вам не нужно.) .pop()операции также выполняются быстро и эффективно.
  • .insert() вставляет элемент в произвольную позицию списка. Например, list_of_ints.insert(0,10) повернулся бы list_of_ints в [10,1,2,3]. Обратите внимание: чем ближе вы вставляете элементы к началу списка, тем медленнее будет эта операция, хотя вы не заметите значительного замедления, если только ваш список не содержит много тысяч элементов или вы не выполняете вставки в узком цикле.
  • .pop(x) удаляет элемент по индексу x. Так list_of_ints.pop(0) удалит элемент с индексом 0. Опять же, чем ближе вы находитесь к началу списка, тем медленнее может быть эта операция.
  • .remove(item) удаляет элемент из списка, но нет исходя из его индекса. Скорее, .remove() удаляет первое появление указанного вами объекта, осуществляя поиск сверху вниз. Для [3,7,7,9,8].remove(7)первый 7 будет удален, в результате чего появится список [3,7,9,8]. Эта операция также может замедляться для большого списка, поскольку теоретически для работы ей необходимо пройти по всему списку.

Нарезка списка Python

Списки можно разделить на новые списки. Этот процесс называется нарезка. Python slice Синтаксис позволяет указать, какую часть списка следует вырезать и как манипулировать вырезанной частью.

Выше вы видели, как использовать скобки для получения одного элемента из списка: my_list[2], например. Срезы используют вариант одной и той же индексной записи (и следуют одним и тем же правилам индексации): list_object[start:stop:step].

Обратите внимание на следующее:

  • start это позиция в списке, с которой начинается срез.
  • stop это позиция в списке, где мы прекращаем нарезку. Другими словами, эта позиция и все, что после нее опущено.
  • step является необязательным «каждый n-ный индикатор элемента» для среза. По умолчанию это 1, поэтому срез сохраняет каждый элемент из списка, из которого он вырезается. Набор step к 2и вы выберете каждый второй элемент и так далее.

Вот некоторые примеры. Рассмотрим этот список:


slice_list = [1,2,3,4,5,6,7,8,9,0]
slice_list[0:5] = [1, 2, 3, 4, 5]

Обратите внимание: мы остановились на индексе 4, а не на индексе 5!


slice_list[0:5:2] = [1, 3, 5]

Если вы опустите определенный индекс среза, Python примет значение по умолчанию. Оставьте start индекс, и Python предполагает начало списка:


slice_list[:5] = [1, 2, 3, 4, 5]

Оставьте stop индекс, и Python предполагает конец списка:


slice_list[4:] = [5, 6, 7, 8, 9, 0]

step элемент также может быть отрицательный. Это позволяет нам брать фрагменты, которые являются обратными копиями оригинала:


slice_list[::-1] = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Обратите внимание, что вы можете разрезать в обратном порядке, используя start и stop индексы, которые идут назад, а не вперед:


slice_list[5:2:-1] = [6, 5, 4]

Нарезка и мелкое копирование

Также имейте в виду, что фрагменты списков мелкие копии исходного списка. Исходный список остается неизменным. Элементы, вставленные в новый список, представляют собой те же ссылки на эти элементы, что и элементы в старом списке.

Например, если у вас есть экземпляр класса в списке и вы создаете срез, содержащий этот объект, отдельный новый экземпляр класса не создается — срез только что содержит другая ссылка к такой же экземпляр класса.

Срезы и индексы за пределами границ

Если вы попытаетесь сделать фрагмент больше, чем разрезаемый вами элемент (фрагмент «за пределами границ»), вы не получите IndexError, но вы получите ровно столько, сколько на самом деле есть у нарезанного элемента. Например:

[1,2,3][:10]

даст [1,2,3]. Это позволяет вам делать срезы, не слишком беспокоясь об ограничении границ среза тем, что вы нарезаете.

Сортировка списка Python

Python предоставляет два способа сортировки списков. Вы можете создать новый отсортированный список на основе старого или отсортировать существующий список на месте. Эти параметры имеют разное поведение и разные сценарии использования.

Чтобы создать новый отсортированный список, используйте команду sorted() функция в старом списке:


new_list = sorted(old_list)

Это позволит отсортировать содержимое списка, используя методы сортировки Python по умолчанию. Для строк по умолчанию используется лексический порядок; для чисел это возрастающие значения.

Если вы хотите отсортировать список в обратном порядке, передайте reverse параметр:


new_list = sorted(old_list, reverse=True)

Другой способ сортировки на месте сортировка, выполняет операцию сортировки непосредственно в исходном списке. Для этого используйте список .sort()метод:


old_list.sort()

.sort() также принимает reverse в качестве параметра, позволяющего выполнять сортировку в обратном порядке.

Обратите внимание, что для работы сортировки содержимое списка должно быть единообразным. Например, вы не можете сортировать смесь целых чисел и строк, но можете отсортировать список, состоящий только из целых чисел или всех строк. В противном случае вы получите TypeError в операции сортировки.

Оба sorted() и .sort() также возьми key параметр. key Параметр позволяет предоставить функцию, которую можно использовать для выполнения пользовательской операции сортировки. Когда список сортируется, каждый элемент передается в key функция, а полученное значение используется для сортировки. Например, если бы у нас была смесь целых чисел и строк и мы хотели бы их отсортировать, мы могли бы использовать keyтак:


mixed_list = [1,"2",3,"4", None]

def sort_mixed(item):
    try:
        return int(item)
    except ValueError:
        return 0

sorted_list = sorted(mixed_list, key = sort_mixed)
print (sorted_list)

Обратите внимание, что этот код не будет конвертировать каждый элемент списка в целое число! Скорее, он будет использовать целое число ценить каждого элемента как его значение сортировки. Также обратите внимание, как мы используем try/except блок для перехвата любых значений, которые некорректно преобразуются в целое число, и возврата 0 для них по умолчанию.

Объекты многомерного списка

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

Вот пример двумерного списка:


two_dimensional_list = [
    [0,1,2],
[3,4,5]
]

Самый внешний список, первое измерение, состоит из двух элементов; внутреннее измерение, списки внутри, состоят из трех элементов каждый.

Если вы хотите получить доступ к спискам внутри, вы должны использовать такой синтаксис многоуровневой индексации:


two_dimensional_list[0][2]

Это даст вам первый элемент внешнего списка — список [0,1,2]— и затем третий элемент из этого — 2.

Обратите внимание, что Python не обеспечивать соблюдение любая размерность таких объектов. У вас может быть список списков, в котором каждый подсписок имеет совершенно разную длину, но вам необходимо убедиться, что вы не создали IndexError используя индексы, которые не соответствуют рассматриваемому объекту.

Списки Python не являются массивами

О списках в Python важно знать то, что они не являются «массивами». В других языках, например C, есть одномерные или многомерные конструкции, называемые массивами, которые принимают значения одного типа. Списки неоднородны; они могут принимать объекты любого типа.

Более того, там является отдельный array введите Python. Питон array разработан для эмуляции поведения массива в C и предназначен главным образом для того, чтобы позволить Python работать с массивами C. array type полезен в таких случаях, но почти в каждом случае чистого Python вам захочется использовать списки. Для повседневной работы, в которой обычно используется список, вместо этого использование массивов не дает преимущества в производительности.

Когда использовать списки Python (а когда нет)

Итак, когда списки Python наиболее полезны? Список лучше всего подходит, когда:

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

Список Python менее подходит, если:

  • Вы хотите найти элемент в списке, но не знаете его положение. Ты может сделай это с .index() свойство. Например, вы можете использовать list_of_ints.index(1) найти индекс первого вхождения числа 1 в list_of_ints. Скорость не должна быть проблемой, если ваш список состоит всего из нескольких элементов, но для списков длиной в тысячи элементов это означает, что Python должен искать по всему списку. В таком сценарии используйте словарь, в котором каждый элемент можно найти с помощью ключа и где время поиска будет одинаковым для каждого значения.
  • Вы хотите добавить или удалить элементы с любой позиции, кроме конца. Каждый раз, когда вы это делаете, Python должен двигаться каждый второй элемент после добавленного или удаленного элемента. Чем длиннее список, тем серьезнее становится проблема с производительностью. Python deque object лучше подходит, если вы хотите свободно добавлять или удалять объекты из начала или конца списка.

Related Posts

Оставить комментарий