Список против кортежа, когда использовать каждый?

В Python, когда вы должны использовать списки и кортежи?

Иногда у вас нет выбора, например, если у вас

"hello %s you are %s years old" % x

то x должен быть кортежем.

Но если я тот, кто разрабатывает API и выбирает типы данных, то каковы рекомендации?

Ответ 1

Там существует сильная культура кортежей для гетерогенных коллекций, аналогичная тому, что вы использовали бы struct для C, и списки для однородных коллекций, похожие на то, для чего вы использовали массивы. Но я никогда не был в квадрате с проблемой изменчивости, упомянутой в других ответах. У мутируемости есть зубы (вы на самом деле не можете изменить кортеж), в то время как однородность не применяется, и, похоже, это гораздо менее интересное различие.

Ответ 2

Tuples являются фиксированными размерами по своей природе, тогда как lists являются динамическими.
Другими словами, tuple является неизменным, тогда как list является изменчивым.

  • Вы не можете добавлять элементы в кортеж. Кортежи не имеют метода добавления или расширения.
  • Вы не можете удалить элементы из кортежа. Кортежи не имеют метода удаления или поп-функции.
  • Вы можете найти элементы в кортеже, так как это не изменяет кортеж.
  • Вы также можете использовать оператор in, чтобы проверить, существует ли элемент в кортеже.

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

  • Это делает ваш код более безопасным, если вы "записываете-защищаете" данные, которые не нуждаются в изменении. Использование кортежа вместо списка похоже на наличие подразумеваемого утверждения assert, что эти данные являются постоянными, и для переопределения этого требуется специальная мысль (и определенная функция).

  • Некоторые кортежи могут использоваться как ключи словарей (в частности, кортежи, содержащие неизменяемые значения, такие как строки, числа и другие кортежи). Списки никогда не могут использоваться в качестве словарных клавиш, потому что списки не являются неизменяемыми.

Источник: Погружение в Python 3

Ответ 3

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

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

Ответ 4

Должен ли он быть изменчивым? Используйте список. Не должно ли оно быть изменчивым? Используйте кортеж.

В противном случае это вопрос выбора.

Для коллекций гетерогенных объектов (например, адрес, разбитый на имя, улицу, город, штат и почтовый индекс). Я предпочитаю использовать кортеж. Их всегда можно легко повысить до названных кортежей.

Аналогично, если сборка будет повторяться, я предпочитаю список. Если он просто контейнер для хранения нескольких объектов как один, я предпочитаю кортеж.

Ответ 5

Прежде всего вам нужно решить, нужно ли изменять структуру данных или нет. Как уже упоминалось, списки являются изменяемыми, кортежи - нет. Это также означает, что кортежи могут использоваться для ключей словаря, без каких-либо списков.

По моему опыту, кортежи обычно используются там, где порядок и позиция имеют смысл и постоянны. Например, при создании структуры данных для выбора собственной приключенческой игры я решил использовать кортежи вместо списков, потому что позиция в кортежей была значимой. Вот один пример из этой структуры данных:

pages = {'foyer': {'text' : "some text", 
          'choices' : [('open the door', 'rainbow'),
                     ('go left into the kitchen', 'bottomless pit'),
                     ('stay put','foyer2')]},}

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

Кортежи также более эффективны с точки зрения памяти, чем списки, хотя я не уверен, когда это преимущество станет очевидным.

Также ознакомьтесь с главами списков и кортежей в Think Python.

Ответ 6

Но если я тот, кто разрабатывает API и выбирает типы данных, то каковы рекомендации?

Для входных параметров лучше всего принять самый общий интерфейс, который делает то, что вам нужно. Это редко только кортеж или список - чаще это последовательность, разрезная или даже повторяемая. Утиная утиная Python обычно получает ее бесплатно, если вы явно не проверяете типы ввода. Не делайте этого, если это абсолютно неизбежно.

Для данных, которые вы производите (выходные параметры), просто верните то, что наиболее удобно для вас, например. возвращайте какой-либо тип данных, который вы храните, или что-то, что возвращает ваша вспомогательная функция.

Одна вещь, о которой следует помнить, - не возвращать список (или любую другую изменчивую) эту часть вашего состояния, например.

class ThingsKeeper
    def __init__(self):
        self.__things = []

    def things(self):
        return self.__things  #outside objects can now modify your state

    def safer(self):
        return self.__things[:]  #it copy-on-write, shouldn't hurt performance

Ответ 7

Небольшое, но заметное преимущество списка по кортежу состоит в том, что списки, как правило, несколько более переносимы. Стандартные инструменты с меньшей вероятностью поддерживают кортежи. Например, JSON не имеет типа кортежа. YAML делает, но его синтаксис уродливый по сравнению с его синтаксисом списка, что довольно приятно.

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