专栏首页抠抠空间集合 (set) 的增删改查及 copy()方法

集合 (set) 的增删改查及 copy()方法

简介:

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

1、去重,把一个列表变成集合,就自动去重了。

2、关系测试,测试两组数据之前的交集、差集、并集等关系。

一、集合的创建

1 set1 = set({1,2,3,4,5})
2 set2 = {1,2,3,4,5}
3 set3 = set('abc')
4 print(set1,set2,set3)  #{1, 2, 3, 4, 5} {1, 2, 3, 4, 5} {'c', 'b', 'a'}

二、添加集合元素的方法

▷add( )方法:

此方法是用来往集合里添加单个元素,如果已存在,则不会添加。

1 set1 = {1,2,3,4,5}
2 set1.add(6)
3 print(set1)
4 set1.add(1)
5 print(set1)

▷update( )方法:

此方法是用来迭代的往集合里添加元素

1 set1 = {1,2,3,4,5}
2 set1.update('6')  #不能直接添加数字类型,因为数字类型不可迭代
3 print(set1)       # {1, 2, 3, 4, 5, '6'}
4 
5 set1.update('abc')
6 print(set1)      #{1, 2, 3, 4, 5, 'c', 'a', '6', 'b'}
7 
8 set1.update([1,7,8,9])
9 print(set1)     #{1, 2, 3, 4, 5, 'b', 7, 8, 9, 'a', 'c', '6'}

三、删除集合元素的方法

1 set1 = {1,2,3,4,5}
2 set1.pop()          #随机删除一个元素,将元素值返回
3 
4 set1.remove('2')    #指定删除一个元素,找不到就会报错
5 
6 set1.clear()        #清空整个集合
7 
8 del set1            #删除整个集合

四、查询集合元素的方法

由于集合是无序的又没有索引,所以查询集合元素只有一种,那就是循环,如下:

1 set1 = {1,2,3,4,5}
2 for s in set1:
3     print(s)
4 #结果如下:
5 # 1
6 # 2
7 # 3
8 # 4
9 # 5

五、集合的交集、并集等

 1 set1 = {1,2,3,7,8}
 2 set2 = {2,3,6,9}
 3 
 4 print(set1&set2)  #交集{2, 3}
 5 print(set1|set2)  #并集{1, 2, 3, 6, 7, 8, 9}
 6 print(set1^set2)  #反交集{1, 6, 7, 8, 9}
 7 print(set1-set2)  #差集{8, 1, 7}  独有的
 8 print(set2-set1)  #差集{9, 6}  独有的
 9 
10 
11 set1 = {1,2,3}      #set1为set2的子集
12 set2 = {1,2,3,4,5}  #set2为set1的超集

13 print(set1 < set2)  #判断一个集合是否为另一个集合的子集,用' < '判断  如果是,返回:True

六、frozenset( )不可变集合(无法添加无法修改)

 1 set1 = {1,2,3,4,5}
 2 set2 = frozenset(set1)
 3 print(set2,type(set2))
 4 #结果为:frozenset({1, 2, 3, 4, 5}) <class 'frozenset'>
 5 
 6 #创建方法如下:
 7 set3 = frozenset({1,2,3})
 8 print(set3)         # frozenset({1, 2, 3})
 9 
10 set4 = frozenset('abc') #迭代添加
11 print(set4)         #   frozenset({'a', 'b', 'c'})

七、copy( )与 deepcopy()

这两种方法用于复制一个变量然后赋值给另一个变量。

copy( )----浅复制

简单来讲,用此方法复制后的变量与原变量对应的内存地址是不一样的,修改它第一层的元素,另一个变量不会被修改

但是如果他们有嵌套(如列表里嵌套列表),那么第二层嵌套的列表与另一个变量所对应的列表的地址就是一个内存地址了,

这个时候,如果修改第二层的元素,则另一个变量也会被修改

▷用法:

1 a = ['a','b','c']
2 b = a.copy()
3 print(b)
4 #结果为:['a', 'b', 'c']

▷复制之后两个变量所对应的内存地址的问题:

先看赋值运算:

此时两个内存地址是一样的,更改一个列表的值,另一个也会被修改:如下:

li1 = [1,2,[3,4],5]
li2 = li1
print(li1 is li2)   # True

li2[0] = 0          #更改li2的值,li1也会被修改
print(li1)          #结果:[0, 2, [3, 4], 5]

再看看copy方法:

此时他们的内存地是不同的,更改一个列表的第一层元素的值,另一个不会被更改,如下:

li1 = [1,2,[3,4],5]
li2 = li1.copy()
print(li1 is li2)   #False

li2[0] = 0          #更改li2第一层的值,li1不会被修改
print(li1)          #[1, 2, [3, 4], 5]

但是,如果我们要修改一个列表的第二层元素的话,另一个列表就会被修改了,如下:

1 li1 = [1,2,[3,4],5]
2 li2 = li1.copy()
3 print(li1 is li2)   #False
4 
5 li2[2][0] = 0          #更改li2第二层的值,li1就会被修改
6 print(li1)             #[1, 2, [0, 4], 5]

deepcopy( )----深复制

简单来讲,用此方法复制后的变量与原变量对应的内存地址是不一样的,不管有没有嵌套,修改它第一层的元素,另一个变量不会被修改

但是用这个方法之前,必须得导入copy包,如下:

1 import copy
2 li1 = [1,2,[3,4],5]
3 li2 = copy.deepcopy(li1)
4 print(li1 is li2)       #False
5 
6 li2[2][0] = 0          #更改li2第二层的值,li1也不会被修改
7 print(li1)             #[1, 2, [3, 4], 5]

八、如何将一个列表里的重复元素去掉

▷思路:将列表转换为集合,它会自动去重,然后再将集合转换为列表即可

▷代码:如下:

1 li1 = [1,2,3,2,1,5,6,7,6,5,8]
2 set1 = set(li1)
3 li1 = list(set1)
4 print(li1)      #结果为:[1, 2, 3, 5, 6, 7, 8]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python With-As

    深入理解Python的With-as语句 ---- 学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,...

    BrianLv
  • Python 多线程的同步方法

    ---- 概述 这篇博客是我翻译Python threads synchronization: Locks, RLocks, Semaphores, Condi...

    BrianLv
  • 你知道 Python 这五个有趣的彩蛋吗?

    当一门编程语言是开源的时候,往往会有产生一些搞笑和有趣的东西。通常,这意味着社区的贡献者会为该语言添加一些有趣和特别的彩蛋以及隐藏的特性(当然前提是不会增加在生...

    前朝楚水
  • 数据分析利器-NumPy

    ---- 概述 NumPy类库是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list s...

    BrianLv
  • 技术 | Python从零开始系列连载(八)

    导读 上一期学习了Python特色数据类型(列表)上半节,相信大家都已经熟悉啦,我们这一期就来学习Python特色数据类型(列表)下半节吧! 列表切片 列表切片...

    灯塔大数据
  • CentOS6 Upgrade Python

    CentOS6 升级Python2.7.X和Python3.X ---- 简述 由于产品需要从裸机开始开发所以所有的配置和开发也是从零开始,这个导航是基于cen...

    BrianLv
  • Install Python3.6.x on CentOS7

    ---- 概述 在之前的文章中,我已经介绍了在CentOS6中安装Python2.7.x和Python3.4.x。请参考源码编译安装或者升级Python在Cen...

    BrianLv
  • Python GIL

    ---- 概述 GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很...

    BrianLv
  • Python Data Model

    概述 最近在看《Fluent Python》一书,书中解释了Python很多重要的设计理念和实践,下面是我在看此书的读书笔记。Python的设计思想主要体现在它...

    BrianLv
  • Install Django Nginx uWSGI

    概述 最近项目需要安装和配置多站点环境,所以把多站点开发环境配置和安装记录下来,帮助其他人少走坑。 安装Python 2.7.x 首先安装一些开发环境基本的包和...

    BrianLv

扫码关注云+社区

领取腾讯云代金券