zoukankan      html  css  js  c++  java
  • 集合(set) 深浅拷贝

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

    基础数据类型补充

    join() 加入

    • split的逆反 把列表转化为字符串 ,也可以遍历字符串
    • 不能是整型
    • 用于转换类型
    join 是遍历(迭代)方式添加
    
    li = ["李嘉诚", "麻花藤", "⻩海峰", "刘嘉玲"]
    s = "_".join(li)  
    print(s)  # 打印结果 李嘉诚_麻花藤_⻩海峰_刘嘉玲
    li = "⻩花⼤闺⼥"
    s = "_".join(li)
    print(s)   # 打印结果 ⻩_花_⼤_闺_⼥
    

    删除

    删除列表list

    • 直接循环列表删除列表中的每⼀个元素是不可能删除干净的.
    lst = ["渣渣辉", "古天绿", "陈小春", "彭佳慧", "郑中基", "胡辣汤"]
    new_lst = []
    for el in lst:
         new_lst.append(el)
    for el in new_lst:
         lst.remove(el)
     print(lst)
    
    • 或者 从后往前删除(倒序)
    for i in range(len(li)): # 循环len(li)次, 然后从后往前删除
     li.pop()
    print(li)
    

    删除字典dict

    • dict中的元素在迭代过程中是不允许进⾏删除的
    • 把要删除的元素暂时先保存在⼀个list中, 然后循环list, 再删除

    fromkeys (从键) 类似浅拷贝

    • dict字典里keys共享value
    • dict中的fromkey(),可以帮我们通过list来创建⼀个新的dict
    • 格式 dic = dict.fromkeys(key(或者keys),value)
    dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']}
    

    注意fromkeys的坑:

    dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    dic.get("jay").append("胡⼤")
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤', '胡⼤'], 'JJ': ['周杰伦', '麻花藤', '胡⼤']}
    # 代码中只是更改了jay那个列表. 但是由于jay和JJ⽤的是同⼀个列表. 所以. 前⾯那个改了. 后⾯那个也会跟着改
    

    类型转换

    • 字符串转换数字str =>int 字符串必须都是十进制的数字

    • 数字转换为字符串 直接转换

    • 元组 => 列表 list(tuple)

    • 列表 => 元组 tuple(list)

    • 列表 => 字符串 list=>str str.join(list) 可迭代对象不能出现数字

    • 字符串=> 列表 str=>list str.split()

    • 转换成False的数据: 0,'',None,[],(),{},set() ==> False

    • 除了字典外,容器数据类型之间可以直接互相转换

    • 字典不可以转换

    set (集合) 可以去重复

    空集合 set = set()

    • set集合是python的⼀个基本数据类型. ⼀般不是很常用.
    • set中的元素是不重复的无序的.无序就没有索引
    • 里面的元素必须是可hash的(),
    • set就是

    去重

    # 给list去重复
    # 运用类型转换
    lst = [45, 5, "哈哈", 45, '哈哈', 50]
    lst = list(set(lst)) # 把list转换成set, 然后再转换回list
    print(lst)
    

    set的增删改查

    add 添加

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.add("郑裕玲")
    print(s)
    s.add("郑裕玲") # 重复的内容不会被添加到set集合中
    print(s)
    # "刘嘉玲", '关之琳',"郑裕玲","王祖贤"(set是无序的)
    

    update (迭代添加)

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.update("麻花藤") # 迭代更新
    print(s) 
    # 打印结果: '藤', '刘嘉玲', '麻', '关之琳', '花', '王祖贤'
    s.update(["张曼⽟", "李若彤","李若彤"])
    print(s)
    # 打印结果: '张曼⽟', '关之琳', '李若彤', '王祖贤', '刘嘉玲'
    

    pop 随机弹出

    s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
    item = s.pop() # 随机弹出⼀个.
    print(s)
    print(item)# 删除目标不固定
    
    
    

    remove 指定删除(不存在会报错)

    s.remove("关之琳") # 直接删除元素
    # s.remove("⻢⻁疼") # 不存在这个元素. 删除会报错
    print(s)
    
    
    

    clear 清空

    s.clear()
    # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和 dict区分的. 
    print(s) # set() 
    
    
    

    改 (先remove后add)

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

    查 (for循环迭代)

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

    常用操作

    交集 intersection / &

    并集 union / |

    差集 difference / -

    反交集 symmetric_difference / ^

    ⼦集 issubset / <

    超集 issuperset / >

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

    frozenset (冻结集)

    • set集合本⾝是可以发⽣改变的. 是不可hash的. 我们可以使⽤frozenset来保存数据.
    frozenset是不可变的. 也就是⼀个可哈希的数据类型 
    s = frozenset(["赵本⼭", "刘能", "⽪⻓⼭", "⻓跪"]) 
    dic = {s:'123'} # 可以正常使⽤了 
    print(dic) 
    
    
    

    深浅拷贝

    • 可变类型 : list dict set 里有嵌套会体现出深浅拷贝的id指向不同
    • 不可变类型 : str int bool 数据类型 (最深层数据,在小数据池里)
    • 浅拷贝 : 只拷贝最外层数据(只复制第一层)
    • 深拷贝 : 除了最深层不可变的不拷贝,其他可变路径都拷贝(拷贝可变的数据类型)
    import copy # 调用copy 不然运行不了
    a=[1,2,3,[4,5],6]
    b=a
    c = copy.copy(a)     # 浅拷贝
    d = copy.deepcopy(a) # 深拷贝
    b.append(10)
    c[3].append(11)
    d[3].append(12)
    print(a)  # [1,2,3,[4,5,11],6,10] 单一复制一方变都变
    print(b)  # [1,2,3,[4,5,11],6,10] 单一复制一方变都变
    print(c)  # [1,2,3,[4,5,11],6]  浅拷贝只拷贝最外面一层,
    print(d)  # [1,2,3,[4,5,12],6]  深拷贝会拷贝到[4,5](即除不可变外所有a的内容)
    
    
    
    例 : 浅拷贝
    l2 = l1[:]
    l2 = l1.copy
    
    
    

    深浅拷贝的规律

    • 赋值: 两个变量使用的是同一个空间

    • 浅拷贝:修改不可变数据类型,不变动,修改可变数据类型,变动

    • 深拷贝:修改就不变动

  • 相关阅读:
    华为交换机大量日志报警导致正常日志被覆盖的处理方法-The output rate change ratio exceeded the threshold
    cacti关于流量图时间选择失效的bug
    Centos7搭建新版本cacti1.2.10
    关于mdadm的一些常见操作
    关于Centos7以上系统硬件的一些常用查看命令
    高质量的站点推荐
    cacti最新版v1.2.10监控华为交换机cpu利用率
    CMDB资产管理平台idcops搭建
    关于dell x86架构服务器报错:EDAC MC1: CE row 0, channel 0, label "CPU_SrcID#1_Channel#1_DIMM#0
    centos7--软raid中硬盘故障修复
  • 原文地址:https://www.cnblogs.com/fanxss/p/10988106.html
Copyright © 2011-2022 走看看