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
集合和字典的底層儲存邏輯是一樣的,相當於字典去掉鍵值對的值的功能。