zoukankan      html  css  js  c++  java
  • day7 集合 深浅copy

     

    1昨日内容回顾

    小数据池:
    int  -5~256
    str  特殊字符,*数字20
    
    
    ascii :  8位 1字节  表示1个字符
    unicode  32位  4个字节  表示一个字符
    utf- 8  1个英文 8位,1个字节
            欧洲 16位   两个字节  表示一个字符
            亚洲 24位   三个字节  表示一个字符
    
    gbk    1个英文 8位,1个字节
            亚洲 16位   两个字节  表示一个字符
    
    s = 'alex'
    b = s.encode('utf-8')
    print(b)  # b'alex'
    
    1,基础数据类型汇总补充
    str
    int
    list
        在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错。
    bool
    dict
        1,fromkeys()
    
    tuple
    2,集合set
    3,深浅copy

    2 基础数据类型汇总

    字符串 列表

    #str
    print(''.isspace())
    #list
    lis=[11,22,33,44,55]
    for i in range(len(lis)):
        print(i,lis[i])    ###i=lis的索引值
        # del lis[i]      #循环列表时删除元素时 索引值会改变,从而报错 1[22, 44, 55]2[22, 44]3
    
    <<<
    False
    0 11
    1 22
    2 33
    3 44
    4 55
    lis=[11,22,33,44,55]
    # 打印出lis中的奇数的三种方法:
    # 第一种   #按切片取值
    lis=lis[::2]
    print("
    ")
    print(lis)
    
    # 第二种    添加到一个新列表里面
    lis=[11,22,33,44,55]
    li=[]
    for i in lis:  #i是list里面的元素 注意和range区分
        if lis.index(i)%2!=1:
            li.append(i)
    lis=li
    print(lis)
    # 第三种  #反向删除列表中的元素
    lis=[11,22,33,44,55]
    for i in range(len(lis)-1,-1,-1):  #删除列表的元素要想索引值不改变 可以反向删除
    # for i in range(len(lis)):
        if i%2==1:
            # print(i)
            del lis[i]
            # print(lis)
    print(lis)
    
    
    <<<
    [11, 33, 55]
    [11, 33, 55]
    [11, 33, 55]

    字典

    # dic
    dic=dict.fromkeys(range(1,4),"春哥")  #keys必须是可迭代对象(序列) eg:字符串 列表 元祖 range
    print(dic)
    dic=dict.fromkeys(range(1,4),[])
    dic[1].append("园姐")  #只有列表有append的方法
    print(dic)
    dic[2].append("二哥")
    print(dic)
    #循环时不能删除字典 会报错
    
    1 #创建一个空字典
    dic={'k1':"v1",'k2':"v2","a3":"v3"}
    dic1={}
    for i in dic:
        if "k" in i:
            dic1.setdefault(i,dic[i])
    dic=dic1
    print(dic)
    # 2把字典中的元素放到一个空列表 再对空列表循环
    dic={'k1':"v1",'k2':"v2","a3":"v3"}
    l=[]
    for i in dic:
        if "k" not in i:
            l.append(i)
    for i in l:
        del dic[i]
    print(dic)
    
    <<<
    {1: '春哥', 2: '春哥', 3: '春哥'}
    {1: ['园姐'], 2: ['园姐'], 3: ['园姐']}
    {1: ['园姐', '二哥'], 2: ['园姐', '二哥'], 3: ['园姐', '二哥']}
    {'k1': 'v1', 'k2': 'v2'}
    {'k1': 'v1', 'k2': 'v2'}

    元祖

    tu1=([1],)
    tu2=([1])
    print(tu1,tu2,type(tu1),type(tu2))
    <<<
    ([1],) [1] <class 'tuple'> <class 'list'>

    集合

    #集合:可变的数据类型,它里面的元素必须是不可变的数据类型,无序,不重复
    set1={'alex','wusir','ritian','egon','barry'}
    set2=set({1,2,3})
    print(set1,set2,type(set1),type(set2))
    #
    set1.add('女神')
    set1.update('abc')
    print(set1)
    
    #
    set2={'alex','wusir','ritian','egon','barry'}
    print(set2.pop())#随机删除 有返回值
    print(set2)
    print(set2.remove('alex')) #按元素删除 返回None
    print(set2)
    print(set2.clear()) #清空clear 返回None,清空完原集合成为空集 set() 不是{}(与字典区分)
    print(set2)
    del set2 #删除集合
    
    #
    set3={'alex','wusir','ritian','egon','barry'}
    for i in set3: #无序返回集合的每一个元素
        print(i)
    
    #集合的交并
    set1={1,2,3,4,5}
    set2={4,5,6,7,8}
    print(set1 & set2) #交集
    print(set1.intersection(set2))
    print(set1 | set2) #并集
    print(set1.union(set2))
    print(set1^set2)  #反交集 并集减去交集
    print(set1.symmetric_difference(set2))
    print(set1-set2) #set1独有的
    print(set1.difference(set2))
    #比较集合
    set1={1,2,3}
    set2={1,2,3,4,5,6}
    print(set1<set2)
    print(set1.issubset(set2)) #set1是set2的子集
    print(set2>set1)
    print(set2.issuperset(set1)) #集合set2是1的超集
    
    #去重
    li=[1,2,33,33,4,6,6,8,8,9,9,9]
    set4=set(li) #把列表转换成集合
    print(set4)
    li=list(set4)
    print(li)
    
    s=frozenset('barry') # frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
    for i in s:           #没有add,pop等操作
        print(i)
    
    <<<
    {'ritian', 'barry', 'alex', 'wusir', 'egon'} {1, 2, 3} <class 'set'> <class 'set'>
    {'ritian', 'barry', 'alex', '女神', 'c', 'a', 'wusir', 'egon', 'b'}
    ritian
    {'barry', 'alex', 'wusir', 'egon'}
    None
    {'barry', 'wusir', 'egon'}
    None
    set()
    ritian
    barry
    alex
    wusir
    egon
    {4, 5}
    {4, 5}
    {1, 2, 3, 4, 5, 6, 7, 8}
    {1, 2, 3, 4, 5, 6, 7, 8}
    {1, 2, 3, 6, 7, 8}
    {1, 2, 3, 6, 7, 8}
    {1, 2, 3}
    {1, 2, 3}
    True
    True
    True
    True
    {1, 2, 33, 4, 6, 8, 9}
    [1, 2, 33, 4, 6, 8, 9]
    b
    y
    r
    a

    深浅copy

    '''直接赋值:其实就是对象的引用(别名)。
    
    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
    
    深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。'''
    #深浅copy
    #赋值
    l1=[]
    l2=l1
    l3=l1
    l3.append("a")
    print(l1,l2,l3,id(l1),id(l2),id(l3))
    
    #copy 浅拷贝
    l1=[1,2,[4,5,6],3]
    l2=l1.copy()
    print(l1,l2,id(l1),id(l2))
    l1.append('a')
    print(l1,l2,id(l1),id(l2))   #第一层地址不相同  第一层l2不会随l1改变
    l1[2].append('a')
    print(l1,l2,id(l1),id(l2))
    print(id(l1[2]),id(l2[2])) #重点  第二层地址及以上地址相同
    
    import copy
    l1=[1,2,[4,5,6],3]
    l2=copy.deepcopy(l1)
    print(l1,l2,id(l1),id(l2))
    l1[2].append('a')
    print(l1,l2,id(l1),id(l2))
    print(id(l1[2]),id(l2[2]))   #深拷贝与浅拷贝的区别是 不管多少层 俩个列表完全独立
    
    l1=[1,[1],2,3,4]
    l2=l1[:] #也是浅拷贝 相当于l2=l1.copy()
    print(l1,l2,id(l1),id(l2))
    l1[1].append('a')
    print(l1,l2,id(l1[1]),id(l2[1]))
    <<< ['a'] ['a'] ['a'] 1927665312328 1927665312328 1927665312328 [1, 2, [4, 5, 6], 3] [1, 2, [4, 5, 6], 3] 1927696924744 1927696884808 [1, 2, [4, 5, 6], 3, 'a'] [1, 2, [4, 5, 6], 3] 1927696924744 1927696884808 [1, 2, [4, 5, 6, 'a'], 3, 'a'] [1, 2, [4, 5, 6, 'a'], 3] 1927696924744 1927696884808 1927697092360 1927697092360 [1, 2, [4, 5, 6], 3] [1, 2, [4, 5, 6], 3] 1927697037384 1927696924744 [1, 2, [4, 5, 6, 'a'], 3] [1, 2, [4, 5, 6], 3] 1927697037384 1927696924744 1927697038792 1927697037192 [1, [1], 2, 3, 4] [1, [1], 2, 3, 4] 1927697092360 1927697037384 [1, [1, 'a'], 2, 3, 4] [1, [1, 'a'], 2, 3, 4] 1927696884808 1927696884808
    l1=['alex','taibai','wusir','egon']
    for i in l1:
        print(l1.index(i),i)
    
    for index,i in enumerate(l1,1):
        print(index,i)
    
    
    <<<
    0 alex
    1 taibai
    2 wusir
    3 egon
    1 alex
    2 taibai
    3 wusir
    4 egon
    • 直接赋值:其实就是对象的引用(别名)。

    • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

    • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

  • 相关阅读:
    海量前端后台Java源码模板下载
    【项目源码】基于Spring + Spring MVC + MyBatis的图书馆管理系统
    mysql关键字匹配度模糊查询
    Linux下导入MySQL数据库
    MySQL允许远程登录的授权方法
    MySQL之alter语句用法总结
    Linux下MySQL定时备份数据库
    Linux下MySQL备份指定数据库命令
    ZooKeeper核心概念和架构
    MapReduce核心概念及架构
  • 原文地址:https://www.cnblogs.com/hi-python/p/10085527.html
Copyright © 2011-2022 走看看