В Python, когда использовать словарь, список или набор? - PullRequest
275 голосов
/ 16 августа 2010

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

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

Ответы [ 10 ]

583 голосов
/ 16 августа 2010

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

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

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

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

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

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

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

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

17 голосов
/ 16 августа 2010

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

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

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

5 голосов
/ 22 октября 2012

Хотя это не охватывает set с, это хорошее объяснение dict с и list с:

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

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

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

1 голос
/ 12 июля 2019

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

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 (так же, как 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] равен x
  • l.reverse() - инвертировать элементы l на месте

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

Словарь

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

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

Набор

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

1 голос
/ 27 августа 2018

Для 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 встроены, конечно,

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

PS: диаграмма сделана с помощью yed.Файл graphml находится здесь

1 голос
/ 08 мая 2018

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

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

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

1 голос
/ 06 декабря 2017

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

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 голос
/ 18 июня 2017

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

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

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

...