1. 程式人生 > 實用技巧 >20201011 050.集合_特點_建立和刪除_交集並集差集運算

20201011 050.集合_特點_建立和刪除_交集並集差集運算

集合

集合是無序可變,元素不能重複。實際上,集合底層是字典實現,集合的所有元素都是字典中的“鍵物件”,因此是不能重複的且唯一的。

集合建立和刪除

1. 使用{}建立集合物件,並使用 add()方法新增元素

>>> a = {3,5,7}

>>> a

{3, 5, 7}

>>> a.add(9)

>>> a

{9, 3, 5, 7}

2. 使用 set(),將列表、元組等可迭代物件轉成集合。如果原來資料存在重複資料,則只保留一個。

>>> a = ['a','b','c','b']

>>> b = set(a)

>>> b

{'b', 'a', 'c'}

Me:集合的這個特性可以用來去重。

>>> c = list(b)

>>> c

['c', 'a', 'b']

3. remove()刪除指定元素;clear()清空整個集合

>>> a = {10,20,30,40,50}

>>> a.remove(20)

>>> a

{40, 10, 50, 30}

集合相關操作

像數學中概念一樣,Python 對集合也提供了並集、交集、差集等運算。我們給出示例:

>>> a = {1,3,'xixi'}

>>> b = {'he','it','xixi'}

>>> a|b #並集

{1, 3, 'xixi', 'he', 'it'}

>>> a&b #交集

{'xixi'}

>>> a-b #差集

{1, 3}

>>> a.union(b) #並集

{1, 3, 'xixi', 'he', 'it'}

>>> a.intersection(b) #交集

{'xixi'}

>>> a.difference(b) #差集

{1, 3}

章節實操作業

1. 畫出程式碼 a = [100,200,300]的記憶體儲存示意圖。

2. 使用 range 生成序列:30,40,50,60,70,80

3. 推導式生成列表: a = [x*2 for x in range(100) if x%9==0],手寫出結果。

4. 使用二維列表儲存表格資訊,並畫出簡單的記憶體儲存示意圖:

姓名

年齡

薪資

城市

熊大

20

30000

北京

熊二

19

20000

上海

熊三

18

25000

深圳

5. 元組和列表有哪些共同點?有哪些不同點?

6. 建立一個字典物件,包含如下資訊:

支出金額:300.15,支出日期:2018.10.18,支出人:小明

7. 使用字典儲存行資料,最後將整個表使用列表儲存起來。

姓名

年齡

薪資

城市

熊大

20

30000

北京

熊二

19

20000

上海

熊三

18

25000

深圳

8. 用文字和自己畫的示意圖描述:字典儲存一個鍵值對的底層過程。

9. 集合和字典有什麼關係?

我的解答:

1

記憶體儲存示意圖

2

程式碼:

>>> list(range(30, 80, 10))

[30, 40, 50, 60, 70]

3

[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

4

程式碼:

>>> tb = [

['姓名', '年齡', '薪資', '城市'],

['熊大', 20, 30000, '北京'],

['熊二', 19, 20000, '上海'],

['熊三', 18, 25000, '深圳']

]

>>> tb[2][2]

20000

記憶體儲存示意圖:

5

列表

元組

相同點

①都是有序儲存;

②都可以容納各種不同型別的元素;

③都支援索引、切片等訪問方式,都支援連線操作,都支援成員關係操作和比較運算操作、計數。

不同點

可修改,有增刪修改方法。

不可修改

6

程式碼:

>>> a = {'amount': -300.15, 'date': 20181018, 'name': 'xiaoming'}

>>> a

{'amount': -300.15, 'date': 20181018, 'name': 'xiaoming'}

7

程式碼:

>>> a = {'name': '熊大', 'age': 20, 'salary': 30000, 'city':'北京'}

>>> b = {'name': '熊二', 'age': 19, 'salary': 20000, 'city':'上海'}

>>> c = {'name': '熊三', 'age': 18, 'salary': 25000, 'city':'深圳'}

>>> tb = [a, b, c]

>>> tb[0].get('city')

'北京'

記憶體儲存示意圖:

8

字典儲存鍵值對的過程是,假設我們要儲存一個鍵值對{'name': 'xiaoming'},系統就會有一個散列表,這裡假設這個散列表有4個位置。每個位置的左邊格子存鍵的地址,右邊格子存對應的值的地址。

系統首先計算鍵值對的鍵的hash值,並轉換成二進位制。

>>> bin(hash('name'))

'0b1001111100100100100010111111001111110010110101001011010001110'

散列表從上往下對應的位置的索引表示為00、01、10、11,然後把要存的這個鍵值對的鍵的hash二進位制值從右向左兩位兩位地取到第1個二位是10,那麼就會取檢視散列表的10位置是否為空,為空則把這個鍵值對存到這個位置,不為空則取下一個二位,這裡是11,檢視11位是否為空,為空則存入,不為空則按上述規律迴圈,直到鍵值對存入。

當散列表存滿約三分之二的容量時,散列表會自動擴容,之前的散列表內容會按索引相應地存入擴容後的散列表中。

示意流程圖如下:

9

集合和字典的底層儲存邏輯是一樣的,相當於字典去掉鍵值對的值的功能。