В чем разница между списками и кортежами? - PullRequest
941 голосов
/ 09 марта 2009

Какая разница?

Каковы преимущества / недостатки кортежей / списков?

Ответы [ 18 ]

965 голосов
/ 09 марта 2009

Помимо того, что кортежи являются неизменяемыми, существует также семантическое различие, которое должно определять их использование. Кортежи - это гетерогенные структуры данных (т. Е. Их записи имеют разное значение), а списки - это однородные последовательности. Кортежи имеют структуру, списки имеют порядок.

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

Одним из примеров могут быть пары страниц и номера строки для ссылок на места в книге, например ::

my_location = (42, 11)  # page number, line number

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

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

Есть несколько интересных статей по этому вопросу, например, «Кортежи Python - это не просто списки констант» или «Понимание кортежей и списков в Python» . Официальная документация Python также упоминает это

«Кортежи неизменны и обычно содержат гетерогенную последовательность ...».

В статически типизированном языке, таком как Haskell , значения в кортеже обычно имеют разные типы, и длина кортежа должна быть фиксированной. В списке все значения имеют одинаковый тип, а длина не фиксирована. Так что разница очень очевидна.

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

331 голосов
/ 19 сентября 2013

Разница между списком и кортежем

  1. Дословный

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. размер

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

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

  3. Разрешенные операции

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error
    

    Это также означает, что вы не можете удалить элемент или отсортировать кортеж. Однако вы можете добавить новый элемент в список и кортеж с той лишь разницей, что вы измените идентификатор кортежа, добавив элемент

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
    
  4. Использование

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

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    
  5. Hashable Кортеж является хэшируемым, а список - нет. Хеш-функции возвращают хеш-значение объекта, если оно есть.

    Hashability of list and tuple.

191 голосов
/ 09 марта 2009

Если вы пошли гулять, вы можете в любое время записать свои координаты в (x,y) кортеже.

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

Но вы не могли бы сделать это наоборот.

73 голосов
/ 09 марта 2009

Ключевым отличием является то, что кортежи неизменны. Это означает, что вы не можете изменить значения в кортеже после его создания.

Так что, если вам нужно изменить значения, используйте List.

Преимущества для кортежей:

  1. Незначительное улучшение производительности.
  2. Поскольку кортеж является неизменным, его можно использовать в качестве ключа в словаре.
  3. Если вы не можете изменить его, никто другой не может этого сделать, то есть вам не нужно беспокоиться о каких-либо функциях API и т. Д. Об изменении кортежа без запроса.
31 голосов
/ 09 марта 2009

Списки изменчивы; кортежей нет.

Из docs.python.org / 2 / tutorial / datastructures.html

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

20 голосов
/ 12 августа 2013

Было упомянуто , что разница в значительной степени семантическая: люди ожидают, что кортеж и список будут представлять различную информацию. Но это идет дальше, чем руководство; некоторые библиотеки на самом деле ведут себя по-разному в зависимости от того, что они передаются. Возьмите, например, NumPy (скопировано из другого поста , где я прошу дополнительные примеры):

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

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

18 голосов
/ 19 апреля 2013

Списки предназначены для циклов, кортежи - для структур, т. Е. "%s %s" %tuple.

Списки обычно однородны, кортежи обычно неоднородны.

Списки для переменной длины, кортежи для фиксированной длины.

16 голосов
/ 22 марта 2016

Это пример списков Python:

my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]

Это пример кортежа Python:

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

Списки и кортежи Python похожи в том, что они оба являются упорядоченными коллекциями значений. Помимо небольшой разницы в том, что списки создаются с использованием скобок «[..., ...]» и кортежей с использованием скобок «(..., ...)», основное техническое отличие «жестко запрограммировано в синтаксисе Python» между ними заключается в том, что элементы определенного кортежа являются неизменяемыми, тогда как списки являются изменяемыми (... поэтому только кортежи могут быть хэшируемыми и могут использоваться в качестве словарных / хэш-ключей!). Это приводит к различиям в том, как они могут или не могут быть использованы (применены априори с помощью синтаксиса), и к различиям в том, как люди выбирают их использование (поощряется как «лучшие практики», апостериори, это то, что умный *) 1008 * программисты делают). Основное отличие апостериорной дифференциации использования кортежей от использования списков заключается в том, что означает , которые люди придают порядку элементов.

Для кортежей «порядок» означает не что иное, как определенную «структуру» для хранения информации. Какие значения находятся в первом поле, можно легко переключить во второе поле, поскольку каждое из них предоставляет значения в двух разных измерениях или масштабах. Они дают ответы на различные типы вопросов и обычно имеют форму: для данного объекта / субъекта, каковы его атрибуты? Объект / субъект остается постоянным, атрибуты различаются.

Для списков «порядок» означает последовательность или направленность. Второй элемент ДОЛЖЕН идти после первого элемента, поскольку он расположен на 2-м месте в зависимости от определенной и общей шкалы или измерения. Элементы взяты как единое целое и в основном дают ответы на один вопрос, обычно в форме, для данного атрибута, как эти объекты / субъекты сравниваются? Атрибут остается постоянным, объект / субъект отличается.

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

Подводя итог некоторым мельчайшим деталям

Сходства:

  1. Дубликаты - И кортежи, и списки допускают дубликаты
  2. Индексирование, выбор и нарезка - И кортежи, и списки индексируются с использованием целочисленных значений, указанных в скобках. Таким образом, если вы хотите первые 3 значения данного списка или кортежа, синтаксис будет таким же:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
    
  3. Сравнение и сортировка - Два кортежа или два списка сравниваются по первому элементу, и если есть связь, то по второму элементу и так далее. Дальнейшее внимание не уделяется последующим элементам после того, как более ранние элементы показывают разницу.

    >>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
    True
    >>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
    True
    

Различия: - Априори по определению

  1. Синтаксис - Использование списков [], использование кортежей ()

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

    # Lists are mutable:
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
    >>> top_rock_list[1]
    'Kashmir'
    >>> top_rock_list[1] = "Stairway to Heaven"
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
    
    # Tuples are NOT mutable:       
    >>> celebrity_tuple
    ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
    >>> celebrity_tuple[5]
    'Dead'
    >>> celebrity_tuple[5]="Alive"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    
  3. Хеш-таблицы (словари) - Поскольку хеш-таблицы (словари) требуют, чтобы его ключи были хешируемыми и, следовательно, неизменяемыми, только кортежи могут выступать в качестве словарных ключей, а не списков.

    #Lists CAN'T act as keys for hashtables(dictionaries)
    >>> my_dict = {[a,b,c]:"some value"}
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    #Tuples CAN act as keys for hashtables(dictionaries)
    >>> my_dict = {("John","Wayne"): 90210}
    >>> my_dict
    {('John', 'Wayne'): 90210}
    

Различия - A posteriori, в использовании

  1. Гомо и гетерогенность элементов - Как правило, объекты списка являются однородными, а объекты кортежей неоднородными. То есть списки используются для объектов / субъектов одного и того же типа (как и все кандидаты в президенты, или все песни, или все бегуны), в то время как хотя это не навязывается), тогда как кортежи больше предназначены для разнородных объектов.

  2. Циклы и структуры - Хотя оба позволяют цикл (для x в my_list ...), это действительно имеет смысл сделать для списка. Кортежи больше подходят для структурирования и представления информации (% s% s, находящийся в% s, является% s и в настоящее время% s% ("Джон", "Уэйн", 90210, "Актер", "Мертвый"))

9 голосов
/ 06 июня 2013

Значения list могут быть изменены в любое время, но значения tuples не могут быть изменены.

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

7 голосов
/ 09 марта 2009

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

...