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
集合和字典的底层存储逻辑是一样的,相当于字典去掉键值对的值的功能。