5:Python詳解數據結構

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()方法用於判斷是否超集。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章