В 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]
равно xl.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
с и list
s:
Списки - это то, что им кажется - список ценностей. Каждый из них нумеруется, начиная с нуля - первый нумеруется с нуля, второй 1, третий 2 и т. Д. Вы можете удалить значения из списка и добавить новые значения в конец. Пример: имена ваших многочисленных кошек.
Словари похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. В python слово называется "ключом", а определение - "значением". Значения в словаре не нумеруются - они похожи на то, что предлагает их название - словарь. В словаре у вас есть "индекс" слов, и для каждого из них есть определение. Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.
В сочетании со списками, диктовками и наборами есть и другие интересные объекты Python, OrderedDicts.
Упорядоченные словари аналогичны обычным словарям, но они запоминают порядок вставки элементов. При переборе упорядоченного словаря элементы возвращаются в порядке их добавления ключей.
OrderedDicts может быть полезен, когда вам нужно сохранить порядок ключей, например, при работе с документами: обычно требуется векторное представление всех терминов в документе. Таким образом, используя OrderedDicts, вы можете эффективно проверить, был ли термин прочитан ранее, добавить термины, извлечь термины, и после всех манипуляций вы можете извлечь их упорядоченное векторное представление.
Может быть не по теме с точки зрения вопроса, заданного OP -
- Список: нехешируемая коллекция упорядоченных изменяемых объектов.
- Кортеж: хешируемая коллекция упорядоченных неизменяемых объектов, таких как список.
- Набор: нехешируемая коллекция неупорядоченных, изменяемых и различных объектов.
- Frozenset: хэшируемая коллекция неупорядоченных, неизменяемых и различных объектов.
- Словарь: нехешируемая, неупорядоченная коллекция изменяемых объектов, которая сопоставляет хешируемые значения произвольным значениям.
Чтобы сравнить их визуально, взгляните на изображение-
Когда я использую их, я делаю исчерпывающую таблицу их методов для вашей справки:
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
Список и наборы: когда вы хотите добавлять и удалять значения.
Списки: для поиска значений с использованием индексов
. Наборы: для хранения значений, но вы не можете получить к ним доступ с помощью чего-либо.