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

Когда я должен использовать словарь, список или набор?

Существуют ли сценарии, которые больше подходят для каждого типа данных?

13 ответов

Решение

list следит за порядком, dict а также set не: когда вы заботитесь о порядке, поэтому вы должны использовать list (если ваш выбор контейнеров ограничен этими тремя, конечно;-).

dict ассоциирует с каждым ключом значение, в то время как list а также set просто содержат значения: очень разные варианты использования, очевидно.

set требует, чтобы элементы были хэшируемыми, list не: если у вас есть не хэшируемые элементы, следовательно, вы не можете использовать set и должен вместо этого использовать list,

set запрещает дубликаты, list не: также решающее различие. ("Мультимножество", которое отображает дубликаты в другое число для элементов, присутствующих более одного раза, можно найти в collections.Counter - Вы можете построить один как dict, если по какой-то странной причине вы не можете импортировать collectionsили, в до-2.7 Python как collections.defaultdict(int)с использованием элементов в качестве ключей и связанного значения в качестве счетчика).

Проверка на членство значения в set (или же dict, для ключей) невероятно быстро (занимает около постоянного, короткого времени), в то время как в списке это занимает время, пропорциональное длине списка в среднем и худшем случаях. Так что, если у вас есть хэшированные элементы, вам не нужны ни порядок, ни дубликаты, и вам нужна быстрая проверка членства, set лучше, чем list,

  • Вам просто нужна упорядоченная последовательность предметов? Перейти к списку.
  • Вам просто нужно знать, есть ли у вас уже определенное значение, но без упорядочивания (и вам не нужно хранить дубликаты)? Используйте набор.
  • Вам нужно связать значения с ключами, чтобы потом можно было их эффективно искать (по ключу)? Используй словарь.

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

Если вы хотите собрать неизменный упорядоченный список элементов, используйте tuple, (Например, если вам нужна пара (name, phone_number), которую вы хотите использовать в качестве элемента в наборе, вам потребуется кортеж, а не список, поскольку наборы требуют, чтобы элементы были неизменяемыми).

Если вы хотите собрать изменяемый упорядоченный список элементов, используйте list, (Например, если вы хотите добавить новые телефонные номера в список: [номер1, номер2, ...]).

Если вы хотите сопоставить ключи со значениями, используйте dict, (Например, если вам нужна телефонная книга, которая сопоставляет имена с номерами телефонов: {'John Smith' : '555-1212'}). Обратите внимание, что ключи в dict неупорядочены. (Если вы выполняете итерацию по диктовке (телефонной книге), ключи (имена) могут отображаться в любом порядке).

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

  • Используйте список, если у вас есть упорядоченная коллекция предметов.

  • Используйте набор для хранения неупорядоченного набора элементов.

Короче говоря, используйте:

list - если вам нужна упорядоченная последовательность товаров.

dict - если требуется связать значения с ключами

set - если вам нужно сохранить уникальные элементы.

Детальное объяснение

Список

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

Список реализует все стандартные операции последовательности:

  • x in l а также x not in l
  • l[i], l[i:j], l[i:j:k]
  • len(l), min(l), max(l)
  • l.count(x)
  • l.index(x[, i[, j]]) - индекс 1-го появления x в l (в или после i и раньше j индексы)

Список также реализует все операции изменяемой последовательности:

  • l[i] = x - пункт i из l заменяется на x
  • l[i:j] = t - кусок l от i к j заменяется содержимым итерируемого t
  • del l[i:j] - такой же как l[i:j] = []
  • l[i:j:k] = t - элементы l[i:j:k] заменены на t
  • del l[i:j:k] - удаляет элементы s[i:j:k] из списка
  • l.append(x) - добавляет x до конца последовательности
  • l.clear() - удаляет все предметы из l (так же, как дель l[:])
  • l.copy() - создает неглубокую копию l (такой же как l[:])
  • l.extend(t) или l += t - расширяется l с содержанием t
  • l *= n - обновления l с его содержанием повторяется n раз
  • l.insert(i, x) - вставки x в l по индексу, заданному i
  • l.pop([i]) - извлекает элемент в i а также удаляет его из l
  • l.remove(x) - удалить первый элемент из l где l[i] равно x
  • l.reverse() - меняет местами элементы l на месте

Список можно использовать как стек, воспользовавшись методами append а также pop.

Словарь

Словарь сопоставляет хешируемые значения произвольным объектам. Словарь - это изменяемый объект. Основные операции со словарем - это сохранение значения с некоторым ключом и извлечение значения с помощью ключа.

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

Установлен

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

Для C++ я всегда имел в виду эту блок-схему: в каком сценарии я использую определенный контейнер STL?, поэтому мне было любопытно, если что-то подобное доступно и для Python3, но мне не повезло.

Что нужно помнить для Python: нет единого стандарта Python, как для C++. Следовательно, могут быть огромные различия для разных интерпретаторов Python (например, CPython, PyPy). Следующая блок-схема предназначена для CPython.

Кроме того, я не нашел хорошего способа включить в диаграмму следующие структуры данных: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, а также arrays,

  • OrderedDict а также deque доступны через collections модуль.
  • heapq доступно из heapq модуль
  • LifoQueue, Queue, а также PriorityQueue доступны через queue модуль, предназначенный для одновременного (потокового) доступа. (Существует также multiprocessing.Queue доступны, но я не знаю различий queue.Queue но предположил бы, что это должно использоваться, когда одновременный доступ от процессов необходим.)
  • dict, set, frozen_set, а также list встроены конечно

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

PS: диаграмма была сделана с Yed. Файл graphml находится здесь

Хотя это не распространяется setс, это хорошее объяснение dictс и lists:

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

Словари похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. В python слово называется "ключом", а определение - "значением". Значения в словаре не нумеруются - они похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.

http://www.sthurlow.com/python/lesson06/

В сочетании со списками, диктовками и наборами есть и другие интересные объекты Python, OrderedDicts.

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

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

Может быть не по теме с точки зрения вопроса, заданного OP -

  1. Список: нехешируемая коллекция упорядоченных изменяемых объектов.
  2. Кортеж: хешируемая коллекция упорядоченных неизменяемых объектов, таких как список.
  3. Набор: нехешируемая коллекция неупорядоченных, изменяемых и различных объектов.
  4. Frozenset: хэшируемая коллекция неупорядоченных, неизменяемых и различных объектов.
  5. Словарь: нехешируемая, неупорядоченная коллекция изменяемых объектов, которая сопоставляет хешируемые значения произвольным значениям.

Чтобы сравнить их визуально, взгляните на изображение-

Когда я использую их, я делаю исчерпывающую таблицу их методов для вашей справки:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}

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

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

Словари похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. В python слово называется "ключом", а определение - "значением". Значения в словаре не нумеруются - они похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. В python слово называется "ключом", а определение - "значением". Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.

Словарь: словарь Python используется как хеш-таблица с ключом в качестве индекса и объектом в качестве значения.

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

Набор: набор - это набор с функциями, которые могут определить, присутствует ли объект в наборе или нет.

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

      dictionary_of_transport = {
    "cars": 8,
    "boats": 2,
    "planes": 0
}
print("I have the following amount of planes:")
print(dictionary_of_transport["planes"])
#Output: 0

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

Другие вопросы по тегам