本节的主要内容:

  1. 基础数据类型补充
  2. set集合
  3. 深浅拷贝

主要内容:

一.基础数据类型补充

字符串:

li = ["李嘉诚", "麻花藤", "⻩海峰", "刘嘉玲"]
s = "_".join(li) print(s)
# 李嘉诚_麻花藤_黄海峰_刘嘉玲

可以看出 join() 的作用是把列表中的字符串拼接起来,正好和 split() 相反

字符串转化成列表: split()

列表转化成字符串:join()
x->y类型 y(x)
表示False的数据类型: False, 0, "", [], tuple(), dict(), set(), None.

列表:

 循环删除列表中的每一个元素.

li = [11, 22, 33, 44]
for e in li:
li.remove(e)
print(li)
#结果: [22, 44]

原因分析:

for的运行过程. 会有一个指针来记录当前循环的元素是哪一个, 一开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个.

这个时候. 原来是第一个的元素会自动的变成第0个. 然后指针向后移动一次, 指向1元素.  这时原来的1已经变成了0, 也就不会被删除了.

用del 和pop试试看:

li = [11, 22, 33, 44]
for i in range(0, len(li)):
del li[i]
print(li)
结果: 报错 # i= 0, 1, 2 删除的时候li[0] 被删除之后.后面一个就变成了第0个.
# 以此类推. 当i = 2的时候. list中只有一个元素. 但是这个时候删除的是第2个 肯定报错啊

经过测试分析发现,循环删除都不行,不论是用del还remove,都不能实现

for el in li:
li.pop() # pop也不行
print(li)
#结果: [11, 22]

经过测试发现pop也不能实现循环删除

所以要执行循环删除只有这样才行:

for i in range(0, len(li)):    # 循环len(li)次, 然后从后往前删除
li.pop()
print(li)

或者用另一个列表来记录你要删除的内容.然后循环删除

li = [11, 22, 33, 44]
del_li = []
for e in li:
del_li.append(e)
for e in del_li:
li.remove(e)
print(li)

注意:由于删除元素会导致元素的索引改变,所以容易出现问题.尽量不要在循环中直接去删除元素,可以把要删除的元素添加到另一个集合中然后再批量删除.

dic中的fromkeys(),可以帮我们通过list来创建一个dict

dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
结果: {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']

前面列表中的每一项都会作为key,后面列表中的内容作为value,生成dict

但是,要注意:

dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
dic.get("jay").append("胡⼤大")
print(dic)
结果: {'jay': ['周杰伦', '麻花藤', '胡⼤大'], 'JJ': ['周杰伦', '麻花藤', '胡⼤大']}

代码中只是更改了jay那个列表.但是由于jay和JJ用的是同一个列表,所以前面那个改了后面这个也会跟着改

dict中的元素在迭代过程中是不允许进行删除的

dic = {'k1': 'alex', 'k2': 'wusir', 's1': '金老板'}
# 删除key中带有'k'的元素
for k in dic: if 'k' in k:
del dic[k] # dictionary changed size during iteration, 在循环迭代的时候不允许进行删除操作
print(dic)

要进行删除操作,可以把要删除的元素暂时先保存在一个list中,然后循环list,再删除:

dic = {'k1': 'alex', 'k2': 'wusir', 's1': '金老板'}
dic_del_list = []
# 删除key中带有'k'的元素
for k in dic:
if 'k' in k:
dic_del_list.append(k)
for el in dic_del_list:
del dic[el]
print(dic)

二.set集合

set集合是python的一个基本数据类型.一般不是很常用,set中的元素是不重复的.无序的.里面的元素必须是可哈希的(int,str,tuple,bool),我们可以

这样来理解:set就是dict类型的数据,但是是不保存value,只保存key.set也用{}表示

注意: set集合中的元素必须是可hash的,但set本身是不可hash的,set是可变的

set中的元素是不可重复的,且无序的.我们可利用这个特性用它来去掉重复的元素:

s = {"周杰伦", "周杰伦", "周星星"}
print(s)
#结果: {'周星星', '周杰伦'}

set的增删改查

1.增加

s = {"刘嘉玲", '关之琳', "王祖贤"}
s.add("郑裕玲")
print(s)
s.add("郑裕玲") # 重复的内容不会被添加到set集合中
print(s) s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤") # 迭代更新
print(s)
s.update(["张曼玉", "李若彤","李若彤"])
print(s)

2.删除

s = {"刘嘉玲", '关之琳', "王祖贤","张曼玉", "李若彤"}
item = s.pop() # 随机弹出⼀一个.
print(s)
print(item) s.remove("关之琳") # 直接删除元素
# s.remove("马虎疼") # 不存在这个元素. 删除会报错
print(s) s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和 dict区分的.
print(s) # set()

3.修改

# set集合中的数据没有索引. 也没有办法去定位一个元素. 所以没有办法进行直接修改.
# 我们可以采用先删除后添加的方式来完成修改操作
s = {"刘嘉玲", '关之琳', "王祖贤","张曼玉", "李若彤"}
# 把刘嘉玲改成赵本山
s.remove("刘嘉玲")
s.add("赵本山")
print(s)

4.查询

# set是一个可迭代对象. 所以可以进行for循环
for el in s:
print(el)

5.常用操作

s1 = {"刘能", "赵四", "皮长山"}
s2 = {"刘科长", "冯乡长", 皮长山"}
# 交集
# 两个集合中的共有元素
print(s1 & s2) # {'皮长山'}
print(s1.intersection(s2)) # {'皮长山'} # 并集
print(s1 | s2) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'}
print(s1.union(s2)) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'} # 差集
print(s1 - s2) # {'赵四', '刘能'} 得到第⼀个中单独存在的
print(s1.difference(s2)) # {'赵四', '刘能'} # 反交集
print(s1 ^ s2) # 两个集合中单独存在的数据 {'冯乡长', '刘能', '刘科长', '赵四'}
print(s1.symmetric_difference(s2)) # {'冯乡长', '刘能', '刘科长', '赵四'} s1 = {"刘能", "赵四"}
s2 = {"刘能", "赵四", "皮长山"} # 子集
print(s1 < s2) # set1是set2的子集吗? True
print(s1.issubset(s2)) # 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))

set集合本身是可以发生改变的,是不可哈希的,我们可使用frozenset来保存数据.

frozenset是不可变的,也就是一个可哈希的数据类型

s = frozenset(["赵本山", "刘能", "皮长山", "长跪"])
dic = {s:''} # 可以正常使用了
print(dic)

set集合这块的知识不是很常用,了解就可以了

三.深浅拷贝

 lst1 = ["孙悟空", "贝吉塔", "卡卡罗特"]
lst2 = lst1 # 赋值 lst1.append("短笛") print(lst1)
print(lst2) print(id(lst1), id(lst2))

对于list,set,dict来说,直接赋值其实是把内存地址交给变量,并不是复制一份内容.所以lst1的内存指向和lst2是一样的,lst1改变了,lst2也发生改变

浅拷贝

lst1 = ["孙悟空", "贝吉塔", "卡卡罗特"]
lst2 = lst1[:] # [:] 在原来的数据中获取到所有的数据组成新的列表
lst2 = lst1.copy() # 拷贝会帮我们创建新对象 lst1.append("短笛") print(lst1)
print(lst2) print(id(lst1), id(lst2))
lst1 = ["孙悟空", "贝吉塔", "卡卡罗特",["七龙珠","战斗陀螺"]]
lst2 = lst1.copy() # 浅拷贝 lst1[3].append("巴啦啦小魔仙")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))

通过上面的两个例子,可知,浅拷贝只会拷贝第一层的内容,第二层的内容不会拷贝.所以被称为浅拷贝

深拷贝

import copy # 引入拷贝模块
lst1 = ["孙悟空", "贝吉塔", "卡卡罗特",["七龙珠","战斗陀螺"]]
lst2 = copy.deepcopy(lst1) # 会把这个对象相关的内部信息全部复制一份 lst1[3].append("巴啦啦小魔仙")
print(lst1)
print(lst2) print(id(lst1), id(lst2))

经过深拷贝,lst1里面就算第二层的内容发生改变,lst2的内容也不会跟着改变

深度拷贝:把元素内部的元素完全拷贝复制,不会产生一个改变,另一个跟着改变的问题

浅拷贝的优点是:省内存;缺点是:容易出现同一个对象呗多个变量所引用.

深拷贝的优点是:完全拷贝出一份两个对象之间除了数据相同,没有任何关系的对象,缺点是:占内存

共同优点:快速创建对象->原型模式(设计模式)

补充一个知识点:

a = [1, 2]
a[1] = a
print(a[1])
#结果是 [1,[...]]

原因: a与a[1]相互赋值陷入了死循环,使得后面的内容计算不出来

python学习打卡 day07 set集合,深浅拷贝以及部分知识点补充的更多相关文章

  1. set集合,深浅拷贝以及部分知识点补充

    目录: 1.基础数据类型补充 2.set集合 3.深浅拷贝 一,基础数据类型补充 字符串的基本操作 li = ["李李嘉诚", "麻花藤", "⻩黄海 ...

  2. Python学习基础(二)——集合 深浅拷贝 函数

    集合 # 集合 ''' 集合是无序不重复的 ''' # 创建列表 l = list((1, 1, 1)) l1 = [1, 1, 1] print(l) print(l1) print("* ...

  3. set集合,深浅拷⻉以及部分知识点补充

    set集合,深浅拷⻉以及部分知识点补充内容:1. 基础数据类型补充2. set集合3. 深浅拷⻉主要内容: ⼀. 基础数据类型补充⾸先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的 ...

  4. python学习笔记:第7天 深浅拷贝

    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是把一个列表中的数据进行拼接,拼接成字符串(与split方法相反,split方法 ...

  5. 6.Python初窥门径(小数据池,集合,深浅拷贝)

    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...

  6. Python基础知识(六)------小数据池,集合,深浅拷贝

    Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: ​ 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : ​ 一个文 ...

  7. day07 python列表 集合 深浅拷贝

    day07 python   一.知识点补充     1."".join() s = "".join(('1','2','3','4','5'))  #将字符串 ...

  8. Python学习---列表/元组/字典/字符串/set集合/深浅拷贝1207【all】

    1.列表 2.元组 3.字典 4.字符串 5.set集合 6.深浅拷贝

  9. python摸爬滚打之day07----基本数据类型补充, 集合, 深浅拷贝

    1.补充 1.1  join()字符串拼接. strs = "阿妹哦你是我的丫个哩个啷" nw_strs = "_".join(strs) print(nw_s ...

随机推荐

  1. Sqoop 学习之路

    sqoop 基础知识和基本操作可以参考这篇博客:https://www.cnblogs.com/qingyunzong/p/8807252.html#_label3

  2. How to diagnose vehicle fault code by BMW ICOM and ISTA-D software

    Today illustrate how to diagnose vehicle fault code by BMW diagnostic tool BMW ICOM and ISTA-D softw ...

  3. Hadoop学习笔记之六:HDFS功能逻辑(2)

    Lease(租约) HDFS(及大多数分布式文件系统)不支持文件并发写,Lease是HDFS用于保证唯一写的手段. Lease可以看做是一把带时间限制的写锁,仅持有写锁的客户端可以写文件. 租约的有效 ...

  4. MySQL字符类型datetime与timestamp

    这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...

  5. Tree Implementation with Python

    Tree Implementation with Python List of List 代码如下: def binary_tree(val): return [val, [], []] def in ...

  6. Adobe阅读器渗透攻击

    Adobe阅读器渗透攻击 实验前准备 1.两台虚拟机,其中一台为kali,一台为windows xp sp3(老师给的xp虚拟机winxpAttaker,密码:mima1234). 2.设置虚拟机网络 ...

  7. 前端 --- 7 Bootstrop框架

    一.基本结构 1.下载地址   官方地址:https://getbootstrap.com 中文地址:http://www.bootcss.com/ 2.HTML基本搭建结构 <!DOCTYPE ...

  8. ODAC(V9.5.15) 学习笔记(二)控件列表

    ODAC的控件有26个,简单介绍如下: TOraSession  管理Oracle的连接  TOraQuery  使用SQL进行数据获取,自动将更新提交数据库  TSmartQuery    在处理字 ...

  9. uniGUI试用笔记(九)

    uniGUI执行程序部署有3种形式 1.ISAPI模式 部署在IIS或Apache,程序编译为Dll形式,没有试,准备后续专门测试一下. 2.标准执行文件模式 将软件编译成一个独立的Exe文件,包括了 ...

  10. POJ 2387 Til the Cows Come Home 【最短路SPFA】

    Til the Cows Come Home Description Bessie is out in the field and wants to get back to the barn to g ...