Відповіді:
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
.
Коли ви хочете, щоб не упорядкована колекція унікальних елементів, використовуйте set
. (Наприклад, коли потрібно набір усіх слів, що використовуються в документі).
Коли ви хочете зібрати незмінний впорядкований список елементів, використовуйте a tuple
. (Наприклад, коли ви хочете, щоб пара (ім'я, телефонний номер), яку ви хочете використовувати як елемент у наборі, вам знадобиться кортеж, а не список, оскільки набори вимагають, щоб елементи були незмінними).
Коли ви хочете зібрати змінений упорядкований список елементів, використовуйте a list
. (Наприклад, коли ви бажаєте додати до списку нові телефонні номери: [номер1, номер2, ...]).
Коли ви хочете відобразити зі значень ключів до значень, використовуйте a dict
. (Наприклад, коли потрібно телефонну книгу, яка відображає імена до телефонних номерів:) {'John Smith' : '555-1212'}
. Зверніть увагу, що ключі в диктаті не упорядковані. (Якщо ви повторюєте діктант (телефонна книга), клавіші (імена) можуть відображатися в будь-якому порядку).
Коротше кажучи, використовуйте:
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]
, рівного xl.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 знаходиться тут
У поєднанні зі списками , диктами та наборами також є ще один цікавий об’єкт пітона - OrdersDicts .
Впорядковані словники подібно до звичайних словників, але вони пам'ятають порядок введення елементів. Під час ітерації над упорядкованим словником елементи повертаються в тому порядку, в який були додані їхні ключі.
OrdersDicts може бути корисним, коли вам потрібно зберегти порядок клавіш, наприклад, робота з документами: звичайно потрібно векторне представлення всіх термінів у документі. Таким чином, використовуючи OrdersDicts, ви зможете ефективно перевірити, чи був термін прочитаний раніше, додавати терміни, витягувати терміни та після всіх маніпуляцій ви можете витягнути впорядковане векторне зображення їх.
Списки - це те, що їм здається, - список цінностей. Кожен з них нумерується, починаючи з нуля - перший нумерується нулем, другий 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 використовується як хеш-таблиця з ключем як індексом та об'єктом як значенням.
Список: Список використовується для утримання об'єктів у масиві, індексованому позицією цього об’єкта в масиві.
Набір: Набір - це колекція з функціями, які можуть визначити, чи є об’єкт у наборі чи ні.