Когда я должен использовать словарь, список или набор?
Существуют ли сценарии, которые больше подходят для каждого типа данных?
источник
Когда я должен использовать словарь, список или набор?
Существуют ли сценарии, которые больше подходят для каждого типа данных?
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
.
источник
Если вы хотите неупорядоченную коллекцию уникальных элементов, используйте
set
. (Например, когда вы хотите, чтобы набор всех слов, используемых в документе).Если вы хотите собрать неизменный упорядоченный список элементов, используйте
tuple
. (Например, если вам нужна пара (name, phone_number), которую вы хотите использовать в качестве элемента в наборе, вам потребуется кортеж, а не список, поскольку наборы требуют, чтобы элементы были неизменяемыми).Если вы хотите собрать изменяемый упорядоченный список элементов, используйте
list
. (Например, если вы хотите добавить новые телефонные номера в список: [номер1, номер2, ...]).Если вы хотите сопоставить ключи со значениями, используйте
dict
. (Например, если вам нужна телефонная книга, которая сопоставляет имена с номерами телефонов:){'John Smith' : '555-1212'}
. Обратите внимание, что ключи в dict неупорядочены. (Если вы перебираете 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
from вi
toj
заменяется содержимым итерируемого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
(так же, как Dell[:]
)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
.Словарь
Словарь отображает хешируемые значения на произвольные объекты. Словарь - это изменчивый объект. Основные операции над словарем - это сохранение значения с некоторым ключом и извлечение значения с учетом ключа.
В словаре нельзя использовать в качестве ключей значения, которые не могут быть хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы.
Устанавливать
Набор представляет собой неупорядоченную коллекцию различных хешируемых объектов. Набор обычно используется для проверки членства, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и симметричная разность.
источник
Хотя это не охватывает
set
s, это хорошее объяснениеdict
s иlist
s:http://www.sthurlow.com/python/lesson06/
источник
Для 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 находится здесь
источник
В сочетании со списками , диктовками и наборами есть и другие интересные объекты Python, OrderedDicts .
OrderedDicts может быть полезен, когда вам нужно сохранить порядок ключей, например, при работе с документами: обычно требуется векторное представление всех терминов в документе. Таким образом, используя OrderedDicts, вы можете эффективно проверить, был ли термин прочитан ранее, добавить термины, извлечь термины, и после всех манипуляций вы можете извлечь их упорядоченное векторное представление.
источник
Списки - это то, что им кажется - список ценностей. Каждый из них нумеруется, начиная с нуля - первый нумеруется с нуля, второй 1, третий 2 и т. Д. Вы можете удалить значения из списка и добавить новые значения в конец. Пример: имена ваших многочисленных кошек.
Кортежи похожи на списки, но вы не можете изменить их значения. Значения, которые вы задаете вначале, это значения, которые вы застряли для остальной части программы. Опять же, каждое значение нумеруется, начиная с нуля, для удобства. Пример: названия месяцев года.
Словари похожи на то, что предлагает их название - словарь. В словаре у вас есть «индекс» слов, и для каждого из них есть определение. В python слово называется «ключом», а определение - «значением». Значения в словаре не нумеруются - они похожи на то, что предлагает их название - словарь. В словаре у вас есть «индекс» слов, и для каждого из них есть определение. В python слово называется «ключом», а определение - «значением». Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.
источник
При их использовании я делаю исчерпывающую таблицу их методов для вашей справки:
источник
Словарь: словарь Python используется как хеш-таблица с ключом в качестве индекса и объектом в качестве значения.
Список: список используется для хранения объектов в массиве, проиндексированном по позиции этого объекта в массиве.
Набор: Набор - это коллекция с функциями, которые могут определить, присутствует ли объект в наборе или нет.
источник