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

294

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

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

Бланкмэн
источник

Ответы:

603

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

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

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

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

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

Алекс Мартелли
источник
6
Обратите внимание, что в Python 3.7 по умолчанию установлен
дикт
172
  • Вам просто нужна упорядоченная последовательность предметов? Перейти к списку.
  • Вы просто должны знать , когда вы или нет , уже есть определенное значение, но без заказа (и вам не нужно хранить дубликаты)? Используйте набор.
  • Вам нужно связать значения с ключами, чтобы потом можно было их эффективно искать (по ключу)? Используй словарь.
Джон Скит
источник
30
Это должно быть частью "TL; DR" к ответу Алекса М., приведенному выше :-)
Алекс Бошманс
9
Я думаю, что все наоборот ... Алекс должен отдать свои голоса Джону. Этот ответ охватывает практически все, и он гораздо более кратким и ясным.
Мехмет
однако, если вы хотите узнать разницу во времени между этими типами данных, объяснение Алекса работает лучше
kcEmenike
19

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

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

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

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

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

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

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

SLaks
источник
6

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

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- фрагмент lfrom в ito 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(так же, как Del 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]равно х
  • l.reverse()- меняет предметы lна месте

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

Словарь

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

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

Устанавливать

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

lmiguelvargasf
источник
5

Хотя это не охватывает sets, это хорошее объяснение dicts и lists:

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

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

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

Гусь
источник
4

Для 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 находится здесь

математика
источник
3

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

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

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

Федерико Качча
источник
1

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

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

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

Нитиш Кумар Пал
источник
1

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

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

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

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

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

Сринивас П
источник