一、知识点补充

  1.1字符串的基本操作

   

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

1.2列表:

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

 li = [, , , ]
for e in li:
  li.remove(e)
print(li) 结果:
[, ]

  分析原因:

    for 循环运行过程中,会有一个指针来记录当前循环的元素是哪一个,一开始这个指针指向第0个,然后获取到第0元素,紧接着删除第0个,这个时候,原来第一个元素会自动的变成第0个,然后指针向后移动一次,指向第1个元素,这时原来的1已经变成了0,也就不会删除了

  所以删除只有

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

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

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

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

  1.3dict中的fromkey(),可以帮我们通过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)

  1.4类型转换:
  元组 => 列表 list(tuple)
  列表 => 元组 tuple(list)
  list=>str str.join(list)
  str=>list str.split()
  转换成False的数据:
  0,'',None,[],(),{},set() ==> False

二、set集合

  set集合时python的一个基本数据类型,一般不是很长用,set中的元素是不重复的,无序的,里面的元素必须是可哈希的,我们可以把它看作是dict类型的数据,但是不保存value,只保存key,set也用{}表示

set1 = {'','alex',,True,[,,]}  #  报错
set2 = {'','alex',,True,{:}} # 报错
set3 = {'','alex',,True,(,,[,,])} # 报错

  set中的元素是不重复的, 且⽆序的

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

  我们可以使用这个特征去掉重复

# 给list去重复
lst = [, , "哈哈", , '哈哈', ]
lst = list(set(lst)) # 把list转换成set, 然后再转换回list
print(lst)

  1.1set集合的增、删、改、查

  1.1.1

  增加

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

  1.1.2删除

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

  1.1.3修改

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

  1.1.4查询

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

  1.2常用操作

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集合本⾝身是可以发⽣生改变的. 是不可hash的. 我们可以使⽤用frozenset来保存数据.
frozenset是不可变的. 也就是⼀一个可哈希的数据类型

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

三、深浅拷贝

lst1 = ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
结果:
['金毛狮王', '紫衫龙王', '白眉鹰王', '⻘翼蝠王', '杨逍']
['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍']
dic1 = {"id": , "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1['name'] = "范瑶"
print(dic1)
print(dic2)
结果:
{'id': , 'name': '谢逊'}
{'id': , 'name': '谢逊'}
{'id': , 'name': '范瑶'}
{'id': , 'name': '范瑶'}

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

  浅拷贝

lst1 = ["何炅", "杜海涛","周渝民"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝
lst1 = ["何炅", "杜海海涛","周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[].append("无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[]), id(lst2[]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]

  浅拷贝,只会拷贝第一层,第二层的内容不会拷贝,所以成为浅拷贝

  深拷贝

import copy
lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[].append("无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[]), id(lst2[]))
结果:
['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅']]

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

python之set集合及深浅拷贝的更多相关文章

  1. python之set集合、深浅拷贝

    一.基本数据类型补充 1,关于int和str在之前的学习中已经介绍了80%以上了,现在再补充一个字符串的基本操作: li = ['李嘉诚','何炅','海峰','刘嘉玲'] s = "_&q ...

  2. python中set(集合),深浅拷贝以及一些补充知识点

    1.set集合 特点:无序,不重复,元素必须可哈希(不可变) 作用:去重复 本身是可变的数据类型.有增删改查操作.{集合的增删改查操作应用较少,这里不做详细介绍了(这里的增有一个方法update注意这 ...

  3. Python练习_集合和深浅拷贝_day7

    1. 1.作业 1.把列表中所有姓周的人的信息删掉(升级题:此题有坑, 请慎重): lst = ['周老二', '周星星', '麻花藤', '周扒皮'] 结果: lst = ['麻花藤'] 2.车牌区 ...

  4. Python基础数据类型补充及深浅拷贝

    本节主要内容:1. 基础数据类型补充2. set集合3. 深浅拷贝主要内容:一. 基础数据类型补充首先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的自己看一看就可以了.我们补充给一 ...

  5. python 学习笔记5(深浅拷贝与集合)

    拷贝 我们已经详细了解了变量赋值的过程.对于复杂的数据结构来说,赋值就等于完全共享了资源,一个值的改变会完全被另一个值共享. 然而有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这个 ...

  6. 从入门到自闭之Python集合,深浅拷贝(大坑)

    小数据池 int: -5~256 str: 字母,数字长度任意符合驻留机制 字符串进行乘法时总长度不能超过20 特殊符号进行乘法时只能乘以0 代码块: 一个py文件,一个函数,一个模块,终端中的每一行 ...

  7. python day 07-数据类型补充,集合,深浅拷贝

    一.基础数据类型补充 1.列表转字符串 a='A'.join(['c','c','s']) print(a) 2.循环删除列表中的每⼀一个元素 lst=['asdf','dftgst','zsdrfs ...

  8. python随笔 join 字典,列表的清空 set集合 以及深浅拷贝(重点..难点)

    一,字符串和列表的转换 1.str中的 join 方法: 把列表转换成字符串 # 将列表转换成字符串. 每个元素之间用_连接 s = '**'.join(['李启政',' 郑强' , '孙福来']) ...

  9. python set集合 以及 深浅拷贝

    set集合 特点: 无序, 不重复, 元素必须可哈希(不可变) 作用: 去重复 本身是可变的数据类型. 有增删改查操作. frozenset()冻结的集合. 不可变的. 可hash的 深浅拷贝() 1 ...

随机推荐

  1. MySQL Connector/Python 接口 (一)

    这里仅介绍 MySQL 官方开发的 Python 接口,参见这里: https://dev.mysql.com/doc/connector-python/en/ Chapter 1 Introduct ...

  2. 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree

    [题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. #include<cstdio> #include<algor ...

  3. 【02】json语法

    [02] JSON 语法是 JavaScript 语法的子集. JSON 语法规则 JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 ...

  4. CentOS服务器上部署 oracle10gr2

    1.下载Centos系统 Linux 镜像文件.         推荐使用 CentOS5.4,下载地址:http://isoredirect.centos.org/centos/5/isos/i38 ...

  5. validate针对checkbox、radio、select标签的验证

    jQuery.validate 是jquery的一个插件,用来辅助开发者在客户端方便快捷的实现表单验证,最终达到提高用户体验的目的. 示例代码 <form id="formLogin& ...

  6. js控制frameset的rows

    window.parent.document.getElementById("MainWork").rows="*,0" ;

  7. java多线程编程核心技术(二)--对象及变量的并发访问

    1.方法内部的私有变量是线程安全的,实例变量是线程不安全的. 2.A线程先持有object对象的lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法. 3.A ...

  8. Drools等规则引擎技术对比分析

    项目中需要设计开发一个规则引擎服务,于是调研了业界常用的规则引擎. 常见的规则引擎如下: Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clip ...

  9. jQuery鼠标悬停显示提示信息窗体

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Wireshark 抓包遇到 you don’t have permission to capture on that device mac 错误的解决方案

    Wireshark 抓包遇到 you don’t have permission to capture on that device mac 错误的解决方案 上次有篇博客讲了如何利用wireshark ...