Коли в Python, коли використовувати словник, список чи набір?


294

Коли я повинен використовувати словник, список або встановити?

Чи є сценарії, які більше підходять для кожного типу даних?

Відповіді:


603

listСтежить за порядком, dictі setнемає: якщо ви дбаєте про замовлення, тому ви повинні використовувати list(якщо ваш вибір контейнерів обмежуються ці три, звичайно ;-).

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

setвимагає, щоб елементи були хешируемими, listне так: якщо у вас є елементи, які не є хешируемыми, отже, ви не можете їх використовувати, setа натомість потрібно використовувати list.

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

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


6
Зауважимо, що Python 3.7 за замовчуванням
наказує дікт

172
  • Вам просто потрібна впорядкована послідовність елементів? Перейдіть за списком.
  • Вам просто потрібно знати, чи ви вже отримали певну цінність, але без замовлення (і вам не потрібно зберігати дублікати)? Використовуйте набір.
  • Чи потрібно пов'язувати значення з ключами, щоб згодом ви могли їх ефективно шукати (за клавішею)? Використовуйте словник.

30
Це має бути частина "TL; DR" до вищезгаданої відповіді Александера М. :-)
Alex Boschmans

9
Я думаю, що це навпаки. Алекс повинен подарувати свої голоси Джону. Ця відповідь охоплює майже все, і це набагато більш стисло та зрозуміло.
mehmet

якщо ви хочете знати різницю складності в часі між цими типами даних, пояснення Алекса працює краще
kcEmenike

19

Коли ви хочете, щоб не упорядкована колекція унікальних елементів, використовуйте set. (Наприклад, коли потрібно набір усіх слів, що використовуються в документі).

Коли ви хочете зібрати незмінний впорядкований список елементів, використовуйте a tuple. (Наприклад, коли ви хочете, щоб пара (ім'я, телефонний номер), яку ви хочете використовувати як елемент у наборі, вам знадобиться кортеж, а не список, оскільки набори вимагають, щоб елементи були незмінними).

Коли ви хочете зібрати змінений упорядкований список елементів, використовуйте a list. (Наприклад, коли ви бажаєте додати до списку нові телефонні номери: [номер1, номер2, ...]).

Коли ви хочете відобразити зі значень ключів до значень, використовуйте a dict. (Наприклад, коли потрібно телефонну книгу, яка відображає імена до телефонних номерів:) {'John Smith' : '555-1212'}. Зверніть увагу, що ключі в диктаті не упорядковані. (Якщо ви повторюєте діктант (телефонна книга), клавіші (імена) можуть відображатися в будь-якому порядку).


А, він не питав про кортежі.
ханабіт

18
  • Використовуйте словник, коли у вас є набір унікальних ключів, які відображають значення.

  • Скористайтеся списком, якщо у вас є замовлена ​​колекція предметів.

  • Використовуйте набір для зберігання не упорядкованого набору предметів.


6

Коротше кажучи, використовуйте:

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.

Словник

Словник відображає перебірливі значення довільних об'єктів. Словник - це об'єкт, що змінюється. Основні операції зі словником - це збереження значення за допомогою якогось ключа та вилучення значення, заданого ключем.

У словнику ви не можете використовувати в якості значень клавіш, які не є доступними, тобто значеннями, що містять списки, словники чи інші типи змінних.

Встановити

Набір - це не упорядкована колекція різних предметів, що змішуються. Набір зазвичай використовується для тестування членства, видалення дублікатів із послідовності та обчислення математичних операцій, таких як перетину, об'єднання, різниці та симетричної різниці.


5

Хоча це не стосується sets, це добре пояснення dicts і lists:

Списки - це те, що їм здається, - список цінностей. Кожен з них нумерується, починаючи з нуля - перший нумерується нулем, другий 1, третій 2 і т. Д. Можна вилучити значення зі списку та додати нові значення до кінця. Приклад: Імена ваших багатьох котів

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

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


4

Для 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 знаходиться тут


3

У поєднанні зі списками , диктами та наборами також є ще один цікавий об’єкт пітона - OrdersDicts .

Впорядковані словники подібно до звичайних словників, але вони пам'ятають порядок введення елементів. Під час ітерації над упорядкованим словником елементи повертаються в тому порядку, в який були додані їхні ключі.

OrdersDicts може бути корисним, коли вам потрібно зберегти порядок клавіш, наприклад, робота з документами: звичайно потрібно векторне представлення всіх термінів у документі. Таким чином, використовуючи OrdersDicts, ви зможете ефективно перевірити, чи був термін прочитаний раніше, додавати терміни, витягувати терміни та після всіх маніпуляцій ви можете витягнути впорядковане векторне зображення їх.


1

Списки - це те, що їм здається, - список цінностей. Кожен з них нумерується, починаючи з нуля - перший нумерується нулем, другий 1, третій 2 і т. Д. Можна вилучити значення зі списку та додати нові значення до кінця. Приклад: Імена ваших багатьох котів

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

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


1

Використовуючи їх, я роблю вичерпну схему їх методів для довідки:

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

Словник: Словник python використовується як хеш-таблиця з ключем як індексом та об'єктом як значенням.

Список: Список використовується для утримання об'єктів у масиві, індексованому позицією цього об’єкта в масиві.

Набір: Набір - це колекція з функціями, які можуть визначити, чи є об’єкт у наборі чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.