python的list是陣列的結構還是鍊錶的結構?

時間 2021-06-02 23:22:58

1樓:

內部應該是個動態陣列,但是陣列記憶體的應該是指向堆的位址。我也剛開始了解python 望指正。我也是根據資料結構的特點猜的

2樓:

你要知道,dict的key可以不是數字,所以就不能用陣列下標來直接訪問。不管是陣列還是鍊錶,線性查詢都是O(n)的複雜度,而dict基於更複雜的資料結構(可能是雜湊表?我不太清楚Python 怎麼實現的),查詢的時間複雜度要遠低於此(雜湊表的話就是O(1))

3樓:

python的list是動態陣列(Dynamic array - Wikipedia)。

Python裡面的Doubly linked list(雙向鍊錶)是用 collections 模組裡的 deque。

時間複雜度參考: TimeComplexity - Python Wiki

效能比較:

>python

-mtimeit-s

'import collections'-s

'c = collections.deque(xrange(1, 100000000))'

'c.pop()'

10000000

loops

,bestof3

:0.11

usec

perloop

>python

-mtimeit-s

'c = range(1, 100000000)'

'c.pop()'

10000000

loops

,bestof3

:0.174

usec

perloop

>python

-mtimeit-s

'import collections'-s

'c = collections.deque()'

10000000

loops

,bestof3

:0.116

usec

perloop

>python

-mtimeit-s

'c = '

'c.insert(0, 1)'

100000

loops

,bestof3

:36.4

usec

perloop

4樓:EMayej

假設有names = ['張三', 『李四』, .....中間一堆...., '趙五', ...另外一堆...]

scores = [77, 88, .....中間一堆..., 99, ...另外一堆...]

names和scores裡面的元素是一一對應的,那麼,如何查詢'趙五'的分數呢?因為我們並不知道'趙五'是names裡面的第幾個元素,所以必須要遍歷。

別人說的是這個:

for index, name in enumerate(names):

if name == '趙五'print(scores[index])

只要你找出index了,取出來當然是很快的。這個取的過程就是你說的「首位址+偏移位址」,即scores[index].

但是怎麼知道index呢?這個過程慢。

你的理解是針對scores[index]的:

scores是陣列所以scores[index]快,如果scores是鍊錶的話要還要挨個遍歷所以scores[index]慢。。。

從這點來說你的理解是對的,鍊錶找第幾個確實比陣列找第幾個慢得多。因為鍊錶要挨個遍歷,陣列直接取偏移位址就好了。

但是這個跟別人說的事情不是一回事:

別人說的是找這個偏移位址慢 (for index, name in enumerate(names):)

你說的是找到這個偏移位址之後取值慢 ( scores[index] )

你可以試一下deque,那個就是鍊錶。自己手動實現一下,用timeit之類的測一下。

比在這問問題強。

那麼為什麼dict快呢,簡單的來說,dict並不是逐一比較名字,它本身在儲存的時候就帶了查詢的結構,所以查起來快. 具體實現的話,看看hash table是咋回事就行了。

5樓:叢小放光

是的,題主對dict的本質還不太清楚。

list 是用陣列實現的,dict 使用hash表實現的。

這個你就不必懷疑了。

如你所說,用兩個list(陣列)存名字和成績。

查詢時需要逐一比較名字,複雜度是o(n)

但雜湊表的查詢效率是o(1)。

6樓:nJcx

list 實現方式是 arraylist,即陣列,

沒人會用鍊錶實現儲存很多元素的資料結構的,O(n)時間訪問完全不可容忍除非確定這個鍊錶一定不太大(比如鍊錶經常被用來解決Hash表衝突)陣列的插入是慢點,不過現在記憶體操作很快的,無所謂了。

python 中list物件的儲存結構採用的是線性表,因此其查詢複雜度為O(n),而dict物件的儲存結構採用的是雜湊表(hash表),其在最優情況下查詢複雜度為O(1)。

c 裡有沒有類似python中list的結構?

冒泡 若說資料結構本身的模擬,那就是vector 如果說要可以裝不同資料型別,那不是容器本身要管的事情,最簡單的,你弄個vector,啥都能往裡面塞了 薛丁格的貓 這是因為C 和python的從一開始的設計理念就不同。C 中如果只用問題中的那種大而全的資料結構,在某些情況下,效率會非常低。如果你確實...

如何用python以二維陣列的特徵向量為主軸 特徵值為軸長度,畫橢圓?

fig plt.figure figsize 10,10 ax fig.add subplot 111 for imat in range 10 randmat random.uniform 0,1,4 reshape 2,2 randmat 0 1 randmat 1 0 vals,vs eig ...

python中如何將乙個陣列中有關聯的不同元素進行分類?

Justin Z s 1,1,5,6,8,8,2,3,17,18,27,55 a b fori,j inlist zip sorted s sorted s 1 0 a.i if j i 1 b.a a b.a print b 1,1,2,3 5,6 8,8 17,18 27 55 拋個磚 時間關係...