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

内存存储示意图

20201011 050.集合_特点_创建和删除_交集并集差集运算

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

 

内存存储示意图:

20201011 050.集合_特点_创建和删除_交集并集差集运算

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')

'北京'

 

内存存储示意图:

20201011 050.集合_特点_创建和删除_交集并集差集运算

8

字典储存键值对的过程是,假设我们要存储一个键值对{'name': 'xiaoming'},系统就会有一个散列表,这里假设这个散列表有4个位置。每个位置的左边格子存键的地址,右边格子存对应的值的地址。

20201011 050.集合_特点_创建和删除_交集并集差集运算

系统首先计算键值对的键的hash值,并转换成二进制。

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

'0b1001111100100100100010111111001111110010110101001011010001110'

散列表从上往下对应的位置的索引表示为00、01、10、11,然后把要存的这个键值对的键的hash二进制值从右向左两位两位地取到第1个二位是10,那么就会取查看散列表的10位置是否为空,为空则把这个键值对存到这个位置,不为空则取下一个二位,这里是11,查看11位是否为空,为空则存入,不为空则按上述规律循环,直到键值对存入。

当散列表存满约三分之二的容量时,散列表会自动扩容,之前的散列表内容会按索引相应地存入扩容后的散列表中。

示意流程图如下:

20201011 050.集合_特点_创建和删除_交集并集差集运算

9

集合和字典的底层存储逻辑是一样的,相当于字典去掉键值对的值的功能。