Python中常見的數據結構有主要的三類容器。
- 序列(如列表、元組、字符串)
- 映射(如字典)
- 集合(set)
一丶序列
在Python中,把大量數據按次序排列而形成的集合體稱爲序列。Python中的字符串、列表和元組數據類型都是序列。在Python中,所有序列類型都可以進行某些特定的操作。這些操作包括:
- 索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)以及檢查某個元素是否屬於序列的成員。
- 除此之外,Python還有計算序列長度、找出最大元素和最小元素的內建函數。
每種元素的增刪改查其實都差不多 ,這裏只介紹了共有與特點
1. 訪問
索引值是從0開始,第二個則是 1,以此類推,從左向右逐漸變大;列表也可以從後往前,索引值從-1開始,從右向左逐漸變小。該訪問方式適用於所有序列類型的對象:列表、元組、字符串。
2. 切片
切片操作都是獲取索引值位於[start, end)區間內的連續位置上的元素,當步長爲1時,step參數可以省略。該切片方式適用於所有序列類型的對象:列表、元組、字符串。‘
下面以list爲例
>>> n=list(range(10))
>>> n
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> n[0:10:2] #步長爲2,索引值從0開始,每次增長2,但索引值必須小於10。
[0, 2, 4, 6, 8]
>>> n[::3]
[0, 3, 6, 9]
>>> n[7:2:-1] #步長爲負數時,start不能小於end值。
[7, 6, 5, 4, 3]
>>> n[11::-2] #11超過範圍,實際索引從最後一個元素開始。
[9, 7, 5, 3, 1]
>>> n[::-2] #這裏步長爲負數,表示在整個列表內,從後往前取值。
[9, 7, 5, 3, 1]
>>> n[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> n[2:4]=[10,11] #分別更改索引號爲2和3的位置上元素值。
>>> n
[0, 1, 10, 11, 4, 5, 6, 7, 8, 9]
>>> n[-5::2]=[-1,-2,-3] #分別更改索引號爲-5、-3、-1三個位置上的元素值。
>>> n
[0, 1, 10, 11, 4, -1, 6, -2, 8, -3]
3. 加
序列相加生成新序列
以list爲例
>>> vehicle1 = ['train', 'bus', 'car', 'ship']
>>> vehicle2 = ['subway', 'bicycle']
>>> vehicle1 + vehicle2
['train', 'bus', 'car', 'ship', 'subway', 'bicycle']
>>> vehicle1 # vehicle1沒有改變
['train', 'bus', 'car', 'ship']
>>> vehicle2
['subway', 'bicycle']
>>> vehicle=vehicle1 + vehicle2 # 生成新列表賦值給變量vehicle
>>> vehicle
['train', 'bus', 'car', 'ship', 'subway', 'bicycle']
>>> vehicle+=['bike'] #複合賦值語句
>>> vehicle
['train', 'bus', 'car', 'ship', 'subway', 'bicycle', 'bike']
4. 乘
原來序列重複n次
以list爲例
>>> vehicle1 = ['train', 'bus']
>>> vehicle1*2
['train', 'bus', 'train', 'bus']
>>> vehicle1 #原列表保持不變
['train', 'bus']
>>> vehicle=vehicle1*2 #賦值語句
>>> vehicle
['train', 'bus', 'train', 'bus']
>>> vehicle*=2 #複合賦值語句
>>> vehicle
['train', 'bus', 'train', 'bus', 'train', 'bus', 'train', 'bus']
5. 檢查
使用in運算符測試某個元素是否在序列中,避免用index()查找索引位置時由於找不到指定元素而導致的錯誤。
以list爲例
>>> vehicle = ['train', 'bus', 'car', 'subway', 'ship', 'bicycle', 'car']
>>> 'car' in vehicle
True
>>> 'plane' in vehicle
False
>>> vehicle = ['train', 'bus', 'car', 'subway', 'ship', 'bicycle', 'car']
>>> if 'car' in vehicle[3:6]:
print('[3, 6)範圍內car位置索引爲:',vehicle.index('car',3,6))
else:
print('在[3, 6)範圍內沒有car')
>>>'在[3, 6)範圍內沒有car'
二丶字典
字典可通過數據key查找關聯數據value。Python中字典的元素沒有特殊的順序,因此不能像序列那樣通過位置索引來查找成員數據。但是每一個值都有一個對應的鍵。字典的用法是通過鍵key來訪問相應的值value,字典的鍵是不重複的。
初始化
d={}
d=dict()
dict(1='one',2='two')
keys=[1,2,3]
vals=[4,5,6]
d=zip(keys,vals)
formkeys([1,2,3])
val全爲none
key可以是不可地修改類型的數據(數值,字符串,元組),列表不行,因爲列表是可變的
value 可以對應任何類型
字典是無序的,顯示次序由字典內部的存儲結構決定
字典操作
len(a):返回鍵值對的數量
a[key]:鍵爲key的value
a[2]=‘Two’ :存在就修改爲Two,沒有就添加這樣的鍵值對
del(a[2]) :刪除鍵爲2
del a:刪除字典
2 in a :查找是否key2是否在字典 a中
字典方法
-
a.keys():將字典a中的鍵以可迭代的dict_keys對象返回
-
a.values():將字典a中的值以可迭代的dict_values對象返回
-
a.items():所有的鍵和值以dict_items對象返回,每個鍵值對組成一個元組,
-
a.setdefault(2):存在2返回key2的value,沒有就插入key:2,value:None
-
a.update(b):將b中的字典放入a,如果存在就更新,不存在就添加
-
a.clear():變成空字典
-
a.pop(6):刪除key 6 ,pop至少一個參數
-
a.popitem():刪除最後一個鍵值對
-
a.get(6):返回key 6的1 value,不存在返回none,注:a.get(6,‘my’) 沒有找到就返回my
遍歷字典
for i in a: // for i in a.keys() 一樣的效果
print(i,a[i])
for i in a.values(): // for i in a.keys() 一樣的效果
print(i,a[i])
轉換
list(a) :將字典a的鍵變爲list
list(a.keys()) :將字典a的鍵變爲list
list(a.values()) :將字典a的值變爲list
list(a.items()) :將字典a的鍵值對變爲list
tuple(a) :將字典a的鍵變爲tuple
tuple(a.keys()) :將字典a的鍵變爲tuple
tuple(a.values()) :將字典a的值變爲tuple
tuple(a.items()) :將字典a的鍵值對變爲tuple
三丶集合
集合是一組用“{”和“}”括起來的無序不重複元素,元素之間用逗號分隔。元素可以是各種類型的不可變對象。Python提供了集合類型set,用於表示大量無序元素的集合。
1. 初始化
a=set()
a={} 這個是字典
2. 集合運算
並交
並集:創建一個新的集合,該集合包含兩個集合中的所有元素。
交集:創建一個新的集合,該集合爲兩個集合中的公共部分。
>>> vehicle1={'train','bus','car','ship'}
>>> vehicle2={'subway','bicycle','bus'}
>>> vehicle1|vehicle2 #並集
{'car', 'ship', 'bicycle', 'train', 'bus', 'subway'}
>>> vehicle1&vehicle2 #交集
{'bus'}
差
差集:A-B表示集合A與B的差集,返回由出現在集合A中但不出現在集合B中的元素所構成的集合。
>>> vehicle1={'train','bus','car','ship'}
>>> vehicle2={'subway','bicycle','bus'}
>>> vehicle1-vehicle2
{'car', 'ship', 'train'}
>>> vehicle2-vehicle1
{'bicycle', 'subway'}
對稱差
對稱差:返回由兩個集合中那些不重疊的元素所構成的集合。
>>> vehicle1={'train','bus','car','ship'}
>>> vehicle2={'subway','bicycle','bus'}
>>> vehicle1^vehicle2
{'ship', 'car', 'bicycle', 'train', 'subway'}
子集和超集
如果集合A的每個元素都是集合B中的元素,則集合A是集合B的子集。超集是僅當集合A是集合B的一個子集,集合B纔是集合A的一個超集。
- A<=B,檢測A是否是B的子集;
- A<B,檢測A是否是B的真子集;
- A>=B,檢測A是否是B的超集;
- A>B,檢測A是否是B的真超集;
- A |= B將B的元素併入A中。
>>> vehicle1={'train','bus','car','ship'}
>>> vehicle2={'car','ship','bike'}
>>> vehicle2<vehicle1
False
>>> vehicle2>vehicle1
False
>>> vehicle1|=vehicle2
>>> vehicle1
{'car', 'ship', 'train', 'bus', 'bike'}
Python中同樣以面向對象方式實現集合類型的運算。
- union()方法相當於並集運算。intersection()方法相當於交集運算。update()方法相當於集合元素合併運算,注意與union()方法的區別。
- difference()方法相當於差集運算。
- symmetric_difference方法相當於對稱差運算。
- issubset()方法用於判斷是否子集。issuperset()方法用於判斷是否超集。