zoukankan      html  css  js  c++  java
  • Python中的集合

    1.dict中的fromkeys(a, b)函数:

      把a迭代后的每一个元素作为一个key,value都是相同的b

    dic = dict.fromkeys(["a", "b"], ["1", "2"])
    print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2']}
    dic = dict.fromkeys("abcd", ["1", "2"])
    print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2'], 'c': ['1', '2'], 'd': ['1', '2']}
    

      这时如果改变b,那么每一个value都将会改变:

    dic.get("a").append("888")
    print(dic) #结果是{'a': ['1', '2', '888'], 'b': ['1', '2', '888']}
    

    2.集合(set)

      一般不是很常用. set中的元素是不重复的.无序的.里面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也用{}表示

      set集合中的元素必须是可hash的, 但是set本身是不可hash得. set是可变的.

      2.1增删改查

        增加:

          add(a)函数,a必须是set中没有的

          a.update(b):迭代更新,把b迭代,然后加入集合a中

            例:

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.update("麻花藤") # 迭代更新
    print(s) #{'王祖贤', '花', '刘嘉玲', '麻', '关之琳', '藤'}
    

        删除:

          pop():随机删除

          remove(a):直接删除a,如果集合中不存在a,则会报错

          clear():清空

        修改:

          因为没有索引,无法定位,只能用先删除,后增加的方法进行修改

        查询:

          集合是一个可迭代对象,可以用for循环遍历

        常用操作:

    s1 = {"a", "b", "c"}
    s2 = {"c", "d", "e"}
    
    # 交集
    # 两个集合中的共有元素
    print(s1 & s2)  # {'c'}
    print(s1.intersection(s2))  # {'c'}
    
    # 并集
    print(s1 | s2)  # {'e', 'd', 'b', 'a', 'c'}
    print(s1.union(s2))  # {'e', 'd', 'b', 'a', 'c'}
    
    # 差集
    print(s1 - s2)  # {'a', 'b'}
    print(s1.difference(s2))  # {'a', 'b'}
    
    # 反交集
    print(s1 ^ s2)  # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'}
    print(s1.symmetric_difference(s2))  # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'}
    
    
    s1 = {"a", "b"}
    s2 = {"a", "b", "c"}
    
    # 子集
    print(s1 < s2) # set1是set2的⼦子集吗? True
    print(s1.issubset(s2))
    # 超集
    print(s1 > s2) # set1是set2的超集吗? False
    print(s1.issuperset(s2))
    

    3.深浅拷贝

      3.1 引用赋值

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

    1 lst1 = ["a", "b", "c", "d"]
    2 lst2 = lst1
    3 
    4 print(lst1)  # ['a', 'b', 'c', 'd']
    5 print(lst2)  # ['a', 'b', 'c', 'd']
    6 lst1.append("e")
    7 print(lst1)  # ['a', 'b', 'c', 'd', 'e']
    8 print(lst2)  # ['a', 'b', 'c', 'd', 'e']

       3.2  浅拷贝

        创建一个与已有的列表内容相同的另一个列表,有两种方法,一种是使用列表自带的copy()方法,另一种是使用切片.

    #1
    lst1 = ["何炅", "杜海涛","周渝民"] lst2 = lst1.copy()#列表自带的方法 lst1.append("李嘉诚") print(lst1) print(lst2) print(id(lst1), id(lst2)) 结果: 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝
    #2 lst1
    = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]] lst2 = lst1[:]#使用切片来复制 lst1[3].append("无敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] 4417248328 4417248328

        从第二部分可以看出,浅拷贝. 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝

       3.3深拷贝

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

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

  • 相关阅读:
    beego学习笔记(4):开发文档阅读(1)
    go的匿名组合
    beego学习笔记(3)
    beego学习笔记(2)
    python发送post请求发送json数据时,报415的原因和处理方法。
    Kali Linux的安装
    linux下配置mysql的远程访问
    selenium学习笔记
    Fiddler使用方法简介
    使用webdriver打开本地浏览器--python版
  • 原文地址:https://www.cnblogs.com/DoingBe/p/9332305.html
Copyright © 2011-2022 走看看