簡體   English   中英

元組列表和字典之間的主要區別是什么?

[英]What is the major difference between list of tuples and a dictionary?

例如:

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

字典將具有{1:5, 2:6, 3:7}

對列表不是基本的數據結構。 您可以根據需要選擇使用它,但這就像制作列表列表或字典列表一樣。 列表是一種用於存儲線性數據的數據結構:可以在數字行上寫出並標記每個數據0、1、2、3,...的數據。

字典是為O(1)查找時間構建的哈希表 字典也稱為“映射”數據結構,因為它實現了映射(如函數),特別a轉到1b轉到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'

(旁注:我們上面實際顯示的是一個數組,該數組在內存中是連續的...列表實際上在內存中可能不是連續的(通常不是),但是它經常會像它那樣“起作用”,例如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}

有時候,您需要的數據結構不是列表或字典,例如樹。 有時,您可能要同時使用列表和字典。

c仍然是一個元組列表,每個元組都有自己的一對索引。 您通過下標訪問它們,並且元素彼此之間不依賴。

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。

這樣可以為您解決問題嗎?

字典是一種數據結構,它基本上基於哈希表 ,這意味着當您查找任何特定鍵時,該鍵將經過數學處理,以便在內存中存儲該值的存儲位置。 然后,我們可以使用內存中的此位置直接轉到存儲值的位置。 如果我們想基於一個鍵在字典中查找一個值,例如您的示例中為3 ,則我們可以直接轉到內存中的7位置,因為3哈希到內存中的某個位置。

元組列表是類似數組的數據結構。 這意味着,如果要查找鍵(引用元組中的第一個條目),則必須遍歷列表中的每個值,直到找到匹配的元組。 在這種情況下,我們必須檢查(1,5)(2,6)(3,7) 這花費了很多時間,因此字典的優點之一是查找值根本不需要花費很多時間!

具體而言,對於字典,基於鍵的搜索值平均為O(1) ,而列表的搜索值為O(n) 兩種算法在進行訪問,插入和刪除所需的時間上也有所不同,但是這些算法的許多細節取決於列表是如何在后台實現的(即,它是單鏈接列表,還是雙重列表)鏈表,調整大小的數組或跳過列表)。 請查看此頁面,以獲取有關跨數據結構進行的各種操作的速度差異的更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM