2016-01-27 4 views
0

Например:В чем основное отличие между списком кортежей и словарем?

a = (1,2,3) 
b= (5,6,7) 
c=zip(a,b) 
[(1,5),(2,6),(3,7)] 

Словарь будет иметь {1:5, 2:6, 3:7}

+4

Это совершенно разные данные. Какие различия, по вашему мнению, имеют? –

+1

Не знаете, почему этот вопрос ниспровергается. На самом деле это довольно важное различие для начинающих программистов. –

ответ

-1

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

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.

ли, что четкие вещи для вас?

+0

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

0

Словарь - это структура данных, основанная на hash table, что означает, что при поиске какой-либо конкретной клавиши ключ обрабатывается математически так, что он выводит местоположение в памяти, где хранится значение. Затем мы можем использовать это местоположение в памяти, чтобы перейти непосредственно туда, где хранится значение. Если мы хотим найти значение в словаре на основе ключа, скажем 3 в вашем примере, мы можем перейти непосредственно к адресу 7 в памяти, потому что 3 хеширует местоположение в памяти.

Список кортежей представляет собой массивную структуру данных. Это означает, что если мы хотим найти ключ (ссылаясь на первую запись в кортеже), мы должны просмотреть каждое значение в списке до тех пор, пока не найдем соответствующий кортеж. В этом случае мы должны проверить (1,5), (2,6) и (3,7)! Это занимает намного больше времени, и, таким образом, одним из преимуществ словаря является то, что поиск значений не требует много времени!

В частности, для словаря поиск значения на основе ключа составляет O(1) в среднем, а для списка - O(n). Существуют также различия между двумя алгоритмами за время, которое требуется для выполнения доступа, вставки и удаления, но многие из них зависят от того, как список реализован под капотом (т. Е. Является ли он связанным списком, вдвойне связанный список, массив повторного размера или список пропуска). Ознакомьтесь с this page для получения более подробной информации о различиях в скорости для различных операций в структурах данных.

1

Список пар не является фундаментальной структурой данных. Вы можете использовать его, если хотите, но это похоже на составление списка списков или список 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) 

Поиск чего-то в списке займет время пропорционально количеству элементов в списке. Это похоже на поиск иглы в стоге сена; вы должны изучить каждый кусок сена, чтобы найти иглу. Мы используем списки для данных с линейным упорядочением, например, графики температуры, где каждый элемент в списке является единицей времени или содержит электронные сообщения в некотором порядке.

Чтобы ответить на вопрос, который вы можете задать, «Когда я использую список пар или словарь, если у меня возникают проблемы с выбором между ними?», Как очень мягкое нечеткое правило, которое вы захотите использовать список пар, когда либо

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

 

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

Там также может быть случаи, когда вам нужна структура данных, которая не является список или словарь, например, как дерево. Иногда вы можете использовать как список, так и словарь.

+0

Хэш-таблица не является фундаментальным типом данных; это просто массив плюс функция для быстрого сопоставления элемента с индексом массива. – chepner

+0

chepner: В контексте я имел в виду фундаментальное значение в смысле 1) это его собственный класс в python, и 2) мы часто думаем о «hashtables», а не о «массивах, используемых в качестве хранилища, чтобы активировать функцию хэш-функции/биннинг абстракции», , Существуют даже другие языки, где люди могут (по какой-то причине) делать противоположное ваше утверждение и строить массивы поверх хеш-таблиц (которые, вероятно, были построены поверх массивов), хотя вы, возможно, знали об этом. – ninjagecko

Смежные вопросы