數據結構與python
『壹』 python自帶及pandas、numpy數據結構(一)
1.python自帶數據結構:序列(如list)、映射(如字典)、集合(set)。
以下只介紹序列中的list:
創建list:
list1 = []
list1 = [1,2,3,4,5,6,7,8,9] #逗號隔開
list2 = [[1,2],[3,4],[5,6],[7,8]] #list2長度(len(list2))為2,list2[0] = [1,2]
liststring = list(「thisisalist」) #只用於創建字元串列表
索引list:
e = list1[0] #下標從零開始,用中括弧
分片list:
es = list1[0:3]
es = list1[0:9:2] #步長在第二個冒號後
list拼接(list1.append(obj)、加運算及乘運算):
list長度:
list每個元素乘一個數值:
list2 = numpy.dot(list2,2)
list類似矩陣相乘(每個元素對應相乘取和):
list3 = numpy.dot(list1,list1)
#要求相乘的兩個list長度相同
list3 = numpy.dot(list2,list22)
#要求numpy.shape(list2)和numpy.shape(list22)滿足「左行等於右列」的矩陣相乘條件,相乘結果numpy.shape(list3)滿足「左列右行」
2.numpy數據結構:
Array:
產生array:
data=np.array([[1, 9, 6], [2, 8, 5], [3, 7, 4]])
data=np.array(list1)
data1 = np.zeros(5) #data1.shape = (5,),5列
data1 = np.eye(5)
索引array:
datacut = data[0,2] #取第零行第二列,此處是6
切片array:
datacut = data[0:2,2] # array([6, 5])
array長度:
data.shape
data.size
np.shape(data)
np.size(data)
len(data)
array拼接:
#括弧內也有一個括弧(中括弧或者小括弧)!
d = np.concatenate((data,data))
d = np.concatenate((data,data),axis = 1) #對應行拼接
array加法:逐個相加
array乘法:
d = data data #逐個相乘
d = np.dot(data,data) #矩陣相乘
d = data 3 #每個元素乘3
d = np.dot(data,3) #每個元素乘3
array矩陣運算:
取逆 : np.linalg.inv(data)
轉置:data.T
所有元素求和 : np.sum(data)
生成隨機數:np.random.normal(loc=0, scale=10, size=None)
生成標准正態分布隨機數組:np.random.normal(size=(4,4))
生成二維隨機數組:
np.random.multivariate_normal([0,0],np.eye(2))
生成范圍在0到1之間的隨機矩陣(M,N):
np.random.randint(0,2,(M,N))
Matrix:
創建matrix:
mat1 = np.mat([[1, 2, 3], [4, 5, 6]])
mat1 = np.mat(list)
mat1 = np.mat(data)
matrix是二維的,所有+,-,*都是矩陣操作。
matrix索引和分列:
mat1[0:2,1]
matrix轉置:
np.transpose(mat1)
mat1.transpose()
matrix拼接:
np.concatenate([mat1,mat1])
np.concatenate([mat1,mat1],axis = 1)
numpy數據結構總結:對於numpy中的數據結構的操作方法基本相同:
創建:np.mat(list),np.array(list)
矩陣乘:np.dot(x,y)
轉置:x.T or np.transpose(x)
拼接:np.concatenate([x,y],axis = 1)
索引:mat[0:1,4],ary[0:1,4]
3.pandas數據結構:
Series:
創建series:
s = pd.Series([[1,2,3],[4,5,6]],index = [『a』,『b』])
索引series:
s1 = s[『b』]
拼接series:
pd.concat([s1,s1],axis = 1) #也可使用s.append(s)
DataFrame:
創建DaraFrame:
df = pd.DataFrame([[1,2,3],[1,2,3]],index = ['a','b'],columns = ['x','y','z'])
df取某一列:
dfc1 =df.x
dfc1 = df[『x』]
dfc2 = df.iloc[:,0] #用.iloc方括弧里是數字而不是column名!
dfc2 = df.iloc[:,0:3]
df取某一行:
dfr1 = df.iloc[0]
df1 = df.iloc[0:2]
df1 = df[0:2] #這種方法只能用於取一個區間
df取某個值:
dfc2 = df.iloc[0,0]
dfc2 = df.iloc[0:2,0:3]
『貳』 PYTHON的數據結構和演算法介紹
當你聽到數據結構時,你會想到什麼?
數據結構是根據類型組織和分組數據的容器。它們基於可變性和順序而不同。可變性是指創建後改變對象的能力。我們有兩種類型的數據結構,內置數據結構和用戶定義的數據結構。
什麼是數據演算法-是由計算機執行的一系列步驟,接受輸入並將其轉換為目標輸出。
列表是用方括弧定義的,包含用逗號分隔的數據。該列表是可變的和有序的。它可以包含不同數據類型的混合。
months=['january','february','march','april','may','june','july','august','september','october','november','december']
print(months[0])#print the element with index 0
print(months[0:7])#all the elements from index 0 to 6
months[0]='birthday #exchange the value in index 0 with the word birthday
print(months)
元組是另一種容器。它是不可變有序元素序列的數據類型。不可變的,因為你不能從元組中添加和刪除元素,或者就地排序。
length, width, height =9,3,1 #We can assign multiple variables in one shot
print("The dimensions are {} * {} * {}".format(length, width, height))
一組
集合是唯一元素的可變且無序的集合。它可以讓我們快速地從列表中刪除重復項。
numbers=[1,2,3,4,6,3,3]
unique_nums = set(numbers)
print(unique_nums)
models ={'declan','gift','jabali','viola','kinya','nick',betty' }
print('davis' in models)#check if there is turner in the set models
models.add('davis')
print(model.pop())remove the last item#
字典
字典是可變和無序的數據結構。它允許存儲一對項目(即鍵和值)
下面的例子顯示了將容器包含到其他容器中來創建復合數據結構的可能性。
* 用戶定義的數據結構*
使用數組的堆棧堆棧是一種線性數據結構,其中元素按順序排列。它遵循L.I.F.O的機制,意思是後進先出。因此,最後插入的元素將作為第一個元素被刪除。這些操作是:
溢出情況——當我們試圖在一個已經有最大元素的堆棧中再放一個元素時,就會出現這種情況。
下溢情況——當我們試圖從一個空堆棧中刪除一個元素時,就會出現這種情況。
隊列是一種線性數據結構,其中的元素按順序排列。它遵循先進先出的F.I.F.O機制。
描述隊列特徵的方面
兩端:
前端-指向起始元素。
指向最後一個元素。
有兩種操作:
樹用於定義層次結構。它從根節點開始,再往下,最後的節點稱為子節點。
鏈表
它是具有一系列連接節點的線性數據。每個節點存儲數據並顯示到下一個節點的路由。它們用來實現撤銷功能和動態內存分配。
圖表
這是一種數據結構,它收集了具有連接到其他節點的數據的節點。
它包括:
演算法
在演算法方面,我不會講得太深,只是陳述方法和類型:
原文:https://www.tuicool.com/articles/hit/VRRvYr3
『叄』 python的基本數據結構有哪些
全國計算機等級考試二級操作題部分採用計算機自動評分方式,其中有的題型採用比照標准答案集進行評分,有的題型用一定的演算法對程序的輸出結果進行檢測來評分。簡笑改
一、Python語言的基本語法元素
1、程序的基本語法元素:程序的格式框架、縮進、注釋、變數、命名、保留字、數據類型、賦值語句、引用;
2、基本輸入輸出函數:input()、eval()、print();
3、源程序的書寫風格;
4、Python語言的特點。
二、基本數據類型
1、數字類型:整數類型、浮點數類型和復數類型;
2、數字類型的運算:數值運算操作符、數值運算函數;
3、字元串類型及格式化:索引、切片、基本的format()格式化方法;
4、字元升數串類型的操作:字元串操作符、處理函數和處理方法;
5、類型判斷和類型間轉換。
三、程序控制結構
1、程序的三種控制結構;
2、程序的分支結構:單分支結構、二分支結構、多分支結構;
3、程序的循環結構:攔判遍歷循環、無限循環、break和continue循環控制;
4、程序的異常處理:try-except。
『肆』 python基礎數據結構:序列、映射、集合
參考資料:http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html
Python中常見的數據結構可以統稱為容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。
一、序列(列表、元組和字元串)
序列中的每個元素都有自己的編號。Python中有6種內建的序列。其中列表和元組是最常見的類型。其他包括字元串、Unicode字元串、buffer對象和xrange對象。下面重點介紹下列表、元組和字元串。
1、列表
列表是可變的,這是它區別於字元串和元組的最重要的特點,一句話概括即:列表可以修改,而字元串和元組不能。
(1)、創建
通過下面的方式即可創建一個列表:
輸出:
['hello', 'world']
[1, 2, 3]
可以看到,這中創建方式非常類似於javascript中的數組。
(2)、list函數
通過list函數(其實list是一種類型而不是函數)對字元串創建列表非常有效:
輸出:
['h', 'e', 'l', 'l', 'o']
2、元組
元組與列表一樣,也是一種序列,唯一不同的是元組不能被修改(字元串其實也有這種特點)。
(1) 、創建
輸出:
(1, 2, 3) ('jeffreyzhao', 'cnblogs') (1, 2, 3, 4) () (1,)
從上面我們可以分析得出:
a、逗號分隔一些值,元組自動創建完成;
b、元組大部分時候是通過圓括弧括起來的;
c、空元組可以用沒有包含內容的圓括弧來表示;
d、只含一個值的元組,必須加個逗號(,);
(2)、tuple函數
tuple函數和序列的list函數幾乎一樣:以一個序列(注意是序列)作為參數並把它轉換為元組。如果參數就算元組,那麼該參數就會原樣返回:
輸出:
(1, 2, 3)
('j', 'e', 'f', 'f')
(1, 2, 3)
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
t4=tuple(123)
TypeError: 'int' object is not iterable
3、字元串
(1)創建
輸出:
Hello world
H
H
e
l
l
o
w
o
r
l
d
(2)、格式化
format():
print(『{0} was {1} years old when he wrote this book』. format(name,age) )
print(『{} was {} years old when he wrote this book』. format(name,age) )
print(『{name} was {age} years old when he wrote this book』. format(name=』Lily』,age=』22』) )
#對於浮點數「0.333」保留小數點後三位
print(『{0 : .3f}』.format(1.0/3) )
結果:0.333
#使用下劃線填充文本,並保持文字處於中間位置
#使用^定義『_____hello_____』字元串長度為11
print(『{0 : ^_11}』.format(『hello』) )
結果:_____hello_____
% :
格式化操作符的右操作數可以是任何東西,如果是元組或者映射類型(如字典),那麼字元串格式化將會有所不同。
輸出:
Hello,world
Hello,World
注意:如果需要轉換的元組作為轉換表達式的一部分存在,那麼必須將它用圓括弧括起來:
輸出:
Traceback (most recent call last):
File "F:\Python\test.py", line 2, in
str1='%s,%s' % 'Hello','world'
TypeError: not enough arguments for format string
如果需要輸出%這個特殊字元,毫無疑問,我們會想到轉義,但是Python中正確的處理方式如下:
輸出:100%
對數字進行格式化處理,通常需要控制輸出的寬度和精度:
輸出:
3.14
3.141593
3.14
字元串格式化還包含很多其他豐富的轉換類型,可參考官方文檔。
4、通用序列操作(方法)
從列表、元組以及字元串可以「抽象」出序列的一些公共通用方法(不是你想像中的CRUD),這些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及檢查某個元素是否屬於序列的成員。除此之外,還有計算序列長度、最大最小元素等內置函數。
(1)索引
輸出
H
2
345
索引從0(從左向右)開始,所有序列可通過這種方式進行索引。神奇的是,索引可以從最後一個位置(從右向左)開始,編號是-1:
輸出:
o
3
123
(2)分片
分片操作用來訪問一定范圍內的元素。分片通過冒號相隔的兩個索引來實現:
輸出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[7, 8]
[7, 8, 9]
不同的步長,有不同的輸出:
輸出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[]
(3)序列相加
輸出:
Hello world
[1, 2, 3, 2, 3, 4]
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
print str1+num1
TypeError: cannot concatenate 'str' and 'list' objects
(4)乘法
輸出:
[None, None, None, None, None, None, None, None, None, None]
HelloHello
[1, 2, 1, 2]
Traceback (most recent call last):
File "F:\Python\test.py", line 5, in
print str1*num1
TypeError: can't multiply sequence by non-int of type 'list'
(5)成員資格
in運算符會用來檢查一個對象是否為某個序列(或者其他類型)的成員(即元素):
輸出:
False
True
True
(6)長度、最大最小值
通過內建函數len、max和min可以返回序列中所包含元素的數量、最大和最小元素。
輸出:
5
o
H
5
123
1
二、映射(字典)
映射中的每個元素都有一個名字,如你所知,這個名字專業的名稱叫鍵。字典(也叫散列表)是Python中唯一內建的映射類型。
1、鍵類型
字典的鍵可以是數字、字元串或者是元組,鍵必須唯一。在Python中,數字、字元串和元組都被設計成不可變類型,而常見的列表以及集合(set)都是可變的,所以列表和集合不能作為字典的鍵。鍵可以為任何不可變類型,這正是Python中的字典最強大的地方。
輸出:
{1: 1}
Traceback (most recent call last):
File "F:\Python\test.py", line 6, in
d[list1]="Hello world."
TypeError: unhashable type: 'list'
2、自動添加
即使鍵在字典中並不存在,也可以為它分配一個值,這樣字典就會建立新的項。
3、成員資格
表達式item in d(d為字典)查找的是鍵(containskey),而不是值(containsvalue)。
三、集合
集合(Set)在Python 2.3引入,通常使用較新版Python可直接創建,如下所示:
strs=set(['jeff','wong','cnblogs'])
nums=set(range(10))
看上去,集合就是由序列(或者其他可迭代的對象)構建的。集合的幾個重要特點和方法如下:
1、副本是被忽略的
集合主要用於檢查成員資格,因此副本是被忽略的,如下示例所示,輸出的集合內容是一樣的。
輸出如下:
set([0, 1, 2, 3, 4, 5])
set([0, 1, 2, 3, 4, 5])
2、集合元素的順序是隨意的
這一點和字典非常像,可以簡單理解集合為沒有value的字典。
輸出如下:
set(['wong', 'cnblogs', 'jeff'])
3、集合常用方法
a、並集union
輸出:
set([1, 2, 3])
set([2, 3, 4])
set([1, 2, 3, 4])
union操作返回兩個集合的並集,不改變原有集合。使用按位與(OR)運算符「|」可以得到一樣的結果:
輸出和上面union操作一模一樣的結果。
其他常見操作包括&(交集),<=,>=,-,()等等,這里不再列舉。
輸出如下:
set([1, 2, 3])
set([2, 3, 4])
set([2, 3])
True
set([1, 2, 3])
False
b、add和remove
和序列添加和移除的方法非常類似,可參考官方文檔:
輸出:
set([1])
set([1, 2])
set([1])
set([1])
False
Traceback (most recent call last):
File "F:\Python\test.py", line 9, in
set1.remove(29) #移除不存在的項
KeyError: 29
4、frozenset
集合是可變的,所以不能用做字典的鍵。集合本身只能包含不可變值,所以也就不能包含其他集合:
輸出如下:
Traceback (most recent call last):
File "F:\Python\test.py", line 3, in
set1.add(set2)
TypeError: unhashable type: 'set'
可以使用frozenset類型用於代表不可變(可散列)的集合:
輸出:
set([1, frozenset([2])])
『伍』 《數據結構與演算法Python語言描述》pdf下載在線閱讀全文,求百度網盤雲資源
《數據結構與演算法Python語言描述》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/13XAS0SLNmxior29Jdxkutw
簡介:數據結構與演算法Python語言描述基於Python語言介紹了數據結構與演算法的基本知識,主要內容包括抽象數據類型和Python面向對象程序設計、線性表、字元串、棧和隊列、二叉樹和樹、集合、排序以及演算法的基本知識。本書延續問題求解的思路,從解決問題的目標來組織教學內容,注重理論與實踐的並用。
『陸』 利用Python進行數據分析筆記:3.1數據結構
元組是一種固定長度、不可變的Python對象序列。創建元組最簡單的辦法是用逗號分隔序列值:
tuple 函數將任意序列或迭代器轉換為元組:
中括弧 [] 可以獲取元組的元素, Python中序列索引從0開始 :
元組一旦創建,各個位置上的對象是無法被修改的,如果元組的一個對象是可變的,例如列表,你可以在它內部進行修改:
可以使用 + 號連接元組來生成更長的元組:
元組乘以整數,則會和列表一樣,生成含有多份拷貝的元組:
將元組型的表達式賦值給變數,Python會對等號右邊的值進行拆包:
拆包的一個常用場景就是遍歷元組或列表組成的序列:
*rest 用於在函數調用時獲取任意長度的位置參數列表:
count 用於計量某個數值在元組中出現的次數:
列表的長度可變,內容可以修改。可以使用 [] 或者 list 類型函數來定義列表:
append 方法將元素添加到列表尾部:
insert 方法可以將元素插入到指定列表位置:
( 插入位置范圍在0到列表長度之間 )
pop 是 insert 的反操作,將特定位置的元素移除並返回:
remove 方法會定位第一個符合要求的值並移除它:
in 關鍵字可以檢查一個值是否在列表中;
not in 表示不在:
+ 號可以連接兩個列表:
extend 方法可以向該列表添加多個元素:
使用 extend 將元素添加到已經存在的列表是更好的方式,比 + 快。
sort 方法可以對列表進行排序:
key 可以傳遞一個用於生成排序值的函數,例如通過字元串的長度進行排序:
bisect.bisect 找到元素應當被插入的位置,返回位置信息
bisect.insort 將元素插入到已排序列表的相應位置保持序列排序
bisect 模塊的函數並不會檢查列表是否已經排序,因此對未排序列表使用bisect不會報錯,但是可能導致不正確結果
切片符號可以對大多數序列類型選取子集,基本形式是 [start:stop]
起始位置start索引包含,結束位置stop索引不包含
切片還可以將序列賦值給變數:
start和stop可以省略,默認傳入起始位置或結束位置,負索引可以從序列尾部進行索引:
步進值 step 可以在第二個冒號後面使用, 意思是每隔多少個數取一個值:
對列表或元組進行翻轉時,一種很聰明的用法時向步進值傳值-1:
dict(字典)可能是Python內建數據結構中最重要的,它更為常用的名字是 哈希表 或者 關聯數組 。
字典是鍵值對集合,其中鍵和值都是Python對象。
{} 是創建字典的一種方式,字典中用逗號將鍵值對分隔:
你可以訪問、插入或設置字典中的元素,:
in 檢查字典是否含有一個鍵:
del 或 pop 方法刪除值, pop 方法會在刪除的同時返回被刪的值,並刪除鍵:
update 方法將兩個字典合並:
update方法改變了字典元素位置,對於字典中已經存在的鍵,如果傳給update方法的數據也含有相同的鍵,則它的值將會被覆蓋。
字典的值可以是任何Python對象,但鍵必須是不可變的對象,比如標量類型(整數、浮點數、字元串)或元組(且元組內對象也必須是不可變對象)。
通過 hash 函數可以檢查一個對象是否可以哈希化(即是否可以用作字典的鍵):
集合是一種無序且元素唯一的容器。
set 函數或者是用字面值集與大括弧,創建集合:
union 方法或 | 二元操作符獲得兩個集合的聯合即兩個集合中不同元素的並集:
intersection 方法或 & 操作符獲得交集即兩個集合中同時包含的元素:
常用的集合方法列表:
和字典類似,集合的元素必須是不可變的。如果想要包含列表型的元素,必須先轉換為元組:
『柒』 python基礎教程-數據類型詳解
python提供了多種的數據類型,用來存放數據。其中數據類型中又包括:字元串,布爾類型指銷,整數,浮點數,數字,列表,元組,字典,日期。
1、字元串
a='this is string'print aa="this is string"print aa='''this is stringthis is stringthis is string'''print a
布爾類型
常見的用橡逗陸於循環判斷中
整數
a=int(80.9741)print a
浮點數
a= float(80.974)print a
字元類型的轉換
int(x [,base]) 將x轉換為一個整數
float(x ) 將x轉換到一個浮點數
complex(real [,imag]) 創建一個復數
str(x) 將對象x轉換為字元串
repr(x) 將對象x轉換為表達式字元串
eval(str) 用來計算在字元串中的有效Python表達式,並返回一個對象
tuple(s) 將序列s轉換為一個元組
list(s) 將序列s轉換為一個列表
chr(x) 將一個整數轉換為一個字元
unichr(x) 將一個整數轉換為Unicode字元
ord(x) 將一個字元轉換為它的整數值
hex(x) 將一個整數轉換為一個十六進制字元串
oct(x) 將一個整數轉換為一個八進制字元串
列表
L1 = [1,2,3]print L1L2 = ['abc']print L2L3 = ["a","b","c"]print L3L = list("Python")print Lprint L[0]print L[3]print L[-1]
Python的元組與列表類似,不同之處在於元組的元素不能修改;元組使用小括弧(),列表使用方括弧[];元組創建很簡單,只需要在括弧中添加元素,並使用逗號(,)隔開即可,例如:
tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "梁頃d";
字典(dictionary)是除列表之外python中最靈活的內置數據結構類型。列表是有序的對象結合,字典是無序的對象集合。兩者之間的區別在於:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。
字典由鍵和對應的值組成。字典也被稱作關聯數組或哈希表。基本語法如下:
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'};
時間日期
import time, datetime;localtime = time.localtime(time.time())today = datetime.date.today()print "Local current time :", today
『捌』 Python數據結構之Array用法實例
Python數據結構之Array用法實例
這篇文章主要介紹了Python數據結構之Array用法實例,較為詳細的講述了Array的常見用法,具有很好的參考借鑒價值,需要的朋友可以參考下
import ctypes
class Array:
def __init__(self, size):
assert size > 0, "Array size must be > 0 "
self._size = size
pyArrayType = ctypes.py_object * size
self._elements = pyArrayType()
self.clear(None)
def clear(self, value):
for index in range(len(self)):
self._elements[index] = value
def __len__(self):
return self._size
def __getitem__(self, index):
assert index >= 0 and index < len(self), "index must >=0 and <= size"
return self._elements[index]
def __setitem__(self, index, value):
assert index >= 0 and index < len(self), "index must >=0 and <= size"
self._elements[index] = value
def __iter__(self):
return _ArrayIterator(self._elements)
class _ArrayIterator:
def __init__(self, theArray):
self._arrayRef = theArray
self._curNdr = 0
def __next__(self):
if self._curNdr < len(theArray):
entry = self._arrayRef[self._curNdr]
sllf._curNdr += 1
return entry
else:
raise StopIteration
def __iter__(self):
return self
class Array2D :
def __init__(self, numRows, numCols):
self._theRows = Array(numCols)
for i in range(numCols):
self._theRows[i] = Array(numCols)
def numRows(self):
return len(self._theRows)
def numCols(self):
return len(self._theRows[0])
def clear(self, value):
for row in range(self.numRows):
self._theRows[row].clear(value)
def __getitem__(self, ndxTuple):
assert len(ndxTuple) == 2, "the tuple must 2"
row = ndxTuple[0]
col = ndxTuple[1]
assert row>=0 and row <len(self.numRows())
and col>=0 and col<len(self.numCols),
"array subscrpt out of range"
theArray = self._theRows[row]
return theArray[col]
def __setitem__(self, ndxTuple, value):
assert len(ndxTuple)==2, "the tuple must 2"
row = ndxTuple[0]
col = ndxTuple[1]
assert row >= 0 and row < len(self.numRows)
and col >= 0 and col < len(self.numCols),
"row and col is invalidate"
theArray = self._theRows[row];
theArray[col] = value
希望本文所述對大家的Python程序設計有所幫助。
『玖』 Python數據結構與演算法-哈希map的實現及原理
1-collections.MutableMapping
1.1 概念:這是什麼?
大家可能想知道這一串英文是什麼意思?其實只需要了解在collections庫當中有一個非常重要的抽象基類MutableMappin
g,專門用於實現map的一個非常有價值的工具。後邊我們會用到它。
2-我們的map基類
2.1 實現這個類
這個基類其實也就是確定了鍵值對的屬性,並且存儲了基本的比較方法。它的對象就是一個鍵值對咯。這個很好理解。有點類似object的感覺。
3-通過map基類實現的無序映射
給大家看一個上邊的例子,這個例子來源於網路,自己改了改,能用,更加詳細而已,湊合看.
4-Python哈希表的實現的基類
4.1 咱有話直說:上才(代)藝(碼)
如果還不知道哈希表概念的同xio,請參考 python進階之數據結構與演算法–中級-哈希表(小白piao分享) 。廢話不多說,咱們擼代碼:
OK了,基本的哈希表就實現了,其實仔細想想很容易,但是自己要能實現還是要理解哈希表的本質哦,外加一定量的練習才可以熟練掌握,練習的目的就是為了熟練而已。
5-分離鏈表實現的具體哈希map類
說明:這玩意只是一種降低沖突的手段,上一節提過,降低沖突最好的地方是發生在元組進入桶的時候,所以想必大家猜到了,接下來的分離鏈表也就是為了self._bucket_xxxxxxx系列方法做准備。這里之所以在上邊使用@abstractmethod就是為了繼承實現,目的可以實現多種將沖突的哈希表。分離鏈表的概念上一節也有的。
「見碼入面」(借鑒:見字如面這個電視節目,有興趣可以看看,還不錯的):
6-用線性探測處理沖突的哈希map類
這種方式的好處不需要再去藉助其他額外的賦值結構來表示桶。結構更加簡單。不會再像上一種方法還要讓桶是一個UnsortedTableMap的對象。
代碼如下:
『拾』 python有哪些數據結構
python三種核心數據結構如下:
1、列表塵態。list是處理一組有序項目的數據結構,即你可以在一個列表中存儲一個序列的項目。列表中的項目。列表中的項目應該包括在方括弧中,這樣python就知道你是在指明一個列表。一旦你創建了一個列表,你就可以添加,刪除,或者是搜索列表中的項目。由於你可以增加或刪除項目,我們說列表是可變的數據類型,即這種類型是可以被改變的,並且列表是可以嵌套的。
2、元組。元組和列表十分相似,不過元組是不可變的。即你不能修改元組。元組通過圓括弧中用逗號分隔的項目定義。元組通常用在使語句或用戶定義的函數能夠安派讓源全的採用一組值的時候,即被使用的元組的值不會改變。元組可以嵌套。
3、字典。字典類似於你通過聯系人名稱查找地址和聯系人詳細情況的滑鋒地址簿,即,我們把鍵(名字)和值(詳細情況)聯系在一起。注意,鍵必須是唯一的,就像如果有兩個人恰巧同名的話,你無法找到正確的信息。
學習Python的注意事項。
1、打好基礎。已經選擇了Python這一門學科,就要堅定學下去的決心,打好基礎很重要。也許一開始會覺得這也不懂那也不懂,硬著頭皮堅持下去。因為Python是一個有條理的、強大的面向對象的程序設計語言,學好基礎知識是前提。
2、Python的基礎知識包括:下載、安裝、導入庫、字元串處理、函數使用等等。如果你的英語不是很好,可以通過「譯中文文檔」這個網站進行翻譯整理。當然翻譯很麻煩,如果想省掉翻譯環節,可以報一個培訓班,進行中文無障礙教學。