Ответы:
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
to 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
.
Словарь отображает хешируемые значения на произвольные объекты. Словарь - это изменчивый объект. Основные операции над словарем - это сохранение значения с некоторым ключом и извлечение значения с учетом ключа.
В словаре нельзя использовать в качестве ключей значения, которые не могут быть хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы.
Набор представляет собой неупорядоченную коллекцию различных хешируемых объектов. Набор обычно используется для проверки членства, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и симметричная разность.
Хотя это не охватывает set
s, это хорошее объяснение dict
s и list
s:
Списки - это то, что им кажется - список ценностей. Каждый из них нумеруется, начиная с нуля - первый нумеруется с нуля, второй 1, третий 2 и т. Д. Вы можете удалить значения из списка и добавить новые значения в конец. Пример: имена ваших многочисленных кошек.
Словари похожи на то, что предлагает их название - словарь. В словаре у вас есть «индекс» слов, и для каждого из них есть определение. В python слово называется «ключом», а определение - «значением». Значения в словаре не нумеруются - они похожи на то, что предлагает их название - словарь. В словаре у вас есть «индекс» слов, и для каждого из них есть определение. Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.
Для 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 слово называется «ключом», а определение - «значением». Значения в словаре не нумеруются - они также не в каком-либо определенном порядке - ключ делает то же самое. Вы можете добавлять, удалять и изменять значения в словарях. Пример: телефонная книга.
При их использовании я делаю исчерпывающую таблицу их методов для вашей справки:
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'}}
Словарь: словарь Python используется как хеш-таблица с ключом в качестве индекса и объектом в качестве значения.
Список: список используется для хранения объектов в массиве, проиндексированном по позиции этого объекта в массиве.
Набор: Набор - это коллекция с функциями, которые могут определить, присутствует ли объект в наборе или нет.