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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

  • Используйте словарь, если у вас есть набор уникальных ключей, которые соответствуют значениям.

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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'}}

Ответ 8

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

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

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

Ответ 9

Для 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. Графический файл здесь

Ответ 10

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

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 в li или после i и до j undes)

Список также реализует все операции изменяемой последовательности:

  • 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.

толковый словарь

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

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

Задавать

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