Например:В чем основное отличие между списком кортежей и словарем?
a = (1,2,3)
b= (5,6,7)
c=zip(a,b)
[(1,5),(2,6),(3,7)]
Словарь будет иметь {1:5, 2:6, 3:7}
Например:В чем основное отличие между списком кортежей и словарем?
a = (1,2,3)
b= (5,6,7)
c=zip(a,b)
[(1,5),(2,6),(3,7)]
Словарь будет иметь {1:5, 2:6, 3:7}
гр еще список кортежей, каждый со своей собственной парой индексов. Вы получаете к ним доступ по индексу, а элементы не зависят друг от друга.
c[0][0] is 1
c[0][1] is 5
c[2][1] is 7
В словаре, первый элемент является индекс ко второму.
d[1] is 5
d[2] is 6
d[3] is 7
Словарь не имеет значения 1, 2 или 3.
ли, что четкие вещи для вас?
На самом деле это не объясняет основные различия в структурах данных, о которых я бы сказал, гораздо важнее понять, почему следует использовать словарь вместо массива кортежей. –
Словарь - это структура данных, основанная на hash table, что означает, что при поиске какой-либо конкретной клавиши ключ обрабатывается математически так, что он выводит местоположение в памяти, где хранится значение. Затем мы можем использовать это местоположение в памяти, чтобы перейти непосредственно туда, где хранится значение. Если мы хотим найти значение в словаре на основе ключа, скажем 3
в вашем примере, мы можем перейти непосредственно к адресу 7
в памяти, потому что 3
хеширует местоположение в памяти.
Список кортежей представляет собой массивную структуру данных. Это означает, что если мы хотим найти ключ (ссылаясь на первую запись в кортеже), мы должны просмотреть каждое значение в списке до тех пор, пока не найдем соответствующий кортеж. В этом случае мы должны проверить (1,5)
, (2,6)
и (3,7)
! Это занимает намного больше времени, и, таким образом, одним из преимуществ словаря является то, что поиск значений не требует много времени!
В частности, для словаря поиск значения на основе ключа составляет O(1)
в среднем, а для списка - O(n)
. Существуют также различия между двумя алгоритмами за время, которое требуется для выполнения доступа, вставки и удаления, но многие из них зависят от того, как список реализован под капотом (т. Е. Является ли он связанным списком, вдвойне связанный список, массив повторного размера или список пропуска). Ознакомьтесь с this page для получения более подробной информации о различиях в скорости для различных операций в структурах данных.
Список пар не является фундаментальной структурой данных. Вы можете использовать его, если хотите, но это похоже на составление списка списков или список dicts. A list - это структура данных, предназначенная для хранения линейных данных: данные, которые имеют смысл записывать на числовой строке, маркируя каждый фрагмент данных 0,1,2,3, ...
Словарь - это hash table , построенный для O (1) времени поиска. Словарь также известен как структура данных «map», поскольку он реализует отображение (например, функцию), в частности a
переходит в 1
, b
переходит в 2
, и, следовательно, словари имеют направление ввоза (в данном случае abc-> 123, а не 123-> abc). Хэш-таблица не имеет понятия индекса.
Для сравнения:
myDictionary = {'a':1, 'b':2, 'c':3}
myDictionary['a']
input:a,b,or c output:1,2,or 3
e.g. "what does 'a' map to?"
'a'
|
\
\---> [speedy hash table]
below
|
| math extracts data
|
____________________
/ \
{ a:1 }
{ b:2 c:3 }
\____________________/
from nebulous magic cloud
|
\
\-----> 1
Теперь список:
myList = ['a', 'b', 'c']
in memory: ['a', 'b', 'c']
0 1 2 <-- indices
>>> myList[1]
'b'
(Sidenote: то, что мы на самом деле показать выше, является массивом, который является непрерывным в памяти ... список может не на самом деле быть смежным в памяти (и часто это не так), но он часто будет «действовать», как он есть, например, для вывода элемента по его индексу требуется O (1) время (это НЕ то же самое, что индекс словаря, который это 'a', 'b', 'c' в нашем примере, индексы списка всегда равны 0,1,2,3,4, ... nomatter, какие данные вы храните). те, мы можем сразу же посмотреть третий элемент в списке, или второй к последнему пункту, или средний элемент)
список пар просто нормальный список ... пар:.
[('a',1), ('b',2), ('c',3)]
in memory: [ pair0 , pair1 , pair2 ]
0 1 2
elsewhere in memory:
pair0 --> ('a',1)
elsewhere in memory:
pair1 --> ('b',2)
pair2 --> ('c',3)
Поиск чего-то в списке займет время пропорционально количеству элементов в списке. Это похоже на поиск иглы в стоге сена; вы должны изучить каждый кусок сена, чтобы найти иглу. Мы используем списки для данных с линейным упорядочением, например, графики температуры, где каждый элемент в списке является единицей времени или содержит электронные сообщения в некотором порядке.
Чтобы ответить на вопрос, который вы можете задать, «Когда я использую список пар или словарь, если у меня возникают проблемы с выбором между ними?», Как очень мягкое нечеткое правило, которое вы захотите использовать список пар, когда либо
{'a':1, 'a':2, 'b':3, 'c':4} #this would make no sense to put in a dictionary
myDict = {}
myDict['a'] = 1
myDict['a'] = 2 #overwrites previous mapping!
myDict['b'] = 3
myDict['c'] = 4
>>> myDict
{'a':2, 'b':3, 'c':4}
Там также может быть случаи, когда вам нужна структура данных, которая не является список или словарь, например, как дерево. Иногда вы можете использовать как список, так и словарь.
Хэш-таблица не является фундаментальным типом данных; это просто массив плюс функция для быстрого сопоставления элемента с индексом массива. – chepner
chepner: В контексте я имел в виду фундаментальное значение в смысле 1) это его собственный класс в python, и 2) мы часто думаем о «hashtables», а не о «массивах, используемых в качестве хранилища, чтобы активировать функцию хэш-функции/биннинг абстракции», , Существуют даже другие языки, где люди могут (по какой-то причине) делать противоположное ваше утверждение и строить массивы поверх хеш-таблиц (которые, вероятно, были построены поверх массивов), хотя вы, возможно, знали об этом. – ninjagecko
Это совершенно разные данные. Какие различия, по вашему мнению, имеют? –
Не знаете, почему этот вопрос ниспровергается. На самом деле это довольно важное различие для начинающих программистов. –