zoukankan      html  css  js  c++  java
  • 7:python数据类型补充:集合、深浅复制

    一、基础数据类型补充知识

    1、fromkeys    将一个对象作为values分别复制给另一个对象,另一个对象里的元素作为keys[注意:此时作为values的元素地址相同,因为他们引用的是同一个地址,所以values相同。

    dic=dict.fromkeys([1,2,3,4,5,6,],[])
    print(dic)

    结果:

    对values  []  进行增加操作,每一个配置的是相同的元素

    dic[1].append('努力!')

    2、循环列表和字典时,不能删除元素或者键值对

    如下:删除key中带’k'的,这种循环时删除键值对会报错,解决的方式是循环时,将key添加到新的列表,然后在遍历列表,将key及其对应的values值删除。

    dic={'k1':'v1','k2':'v2','k3':'v3'}
    for i  in dic.keys():
        if 'k' in i :
            del dic[i]
    print(dic)

    正确的解决方法:

    dic={'k1':'v1','k2':'v2','k3':'v3'}
    l=[]
    for i  in dic.keys():
        if 'k' in i :
            l.append(i)
    # print(dic)
    for j in l :
        del dic[j]
        print(dic)

    3、0、空字符串、空列表、空字典对应的布尔值都是False

    tu1=(1)
    tu2=(1,)
    print(tu1,type(tu1))
    print(tu2,type(tu2))

    结果显示不加逗号,那么这个数据类型就是它元素的类型

    二、集合

    1、集合是可变的数据类型,但是它里面的元素是不可变的数据类型(所以集合不能作为字典的键)。集合里的元素无序、不重复,这是他的特点。

    集合的两个特点:

              1)不重复,把一个列表转化成集合,就自动去重了

              2)关系测试,测试两组数据之前的交集、差集、并集等关系

    2、集合的方法:

    1、集合的创建:

    set1 = set({1,2,'barry'})
    set2 = {1,2,'barry'}
    print(set1,set2)  # {1, 2, 'barry'} {1, 2, 'barry'}

    2、增加:add

    set1 = set({1,2,'barry'})
    set1.add('wyx')

    updata

    set1 = set({1,2,'barry'})
    set2 = {3,2,'barrrrrry'}
    set1.add('wyx')
    set1.update('laoshi')

    3、删除:set .pop    随机删除,返回被删除的元素

                 Set .remove(‘  ‘)按元素删除,没有会报错

         清空集合:set.clear()

                    Del  删除整个集合

    set1 = {'alex','wusir','ritian','egon','barry'}

    set1.remove('alex') # 删除一个元素
    print(set1)

    set1.pop() # 随机删除一个元素
    print(set1)

    set1.clear() # 清空集合
    print(set1)

    del set1 # 删除集合
    print(set1)

       

    4、集合不能修改:1、无序    2、元素不可变,改了就变了

    5、查: 只能用for循环查

    6、交集:

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 & set2)  # {4, 5}
    print(set1.intersection(set2))  # {4, 5}

     7、并集:union   |

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}
    
    print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7}

    8、差集:set1独有的,set2没有

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 - set2)  # {1, 2, 3}
    print(set1.difference(set2))  # {1, 2, 3}

     9、反交集^   :除了共有的元素之外的元素集合

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
    print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

    10、子集与超集

    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是set1超集。

    11、frozenset不可变集合,让集合变成不可变类型。

    s = frozenset('barry')
    print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

    三、深浅Copy

    浅copy

    l1 = [1,2,3,['barry','alex']]
    
    l2 = l1.copy()
    print(l1,id(l1))  # [1, 2, 3, ['barry', 'alex']] 2380296895816
    print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2380296895048
    l1[1] = 222
    print(l1,id(l1))  # [1, 222, 3, ['barry', 'alex']] 2593038941128
    print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2593038941896
     
    l1[3][0] = 'wusir'
    print(l1,id(l1[3]))  # [1, 2, 3, ['wusir', 'alex']] 1732315659016
    print(l2,id(l2[3]))  # [1, 2, 3, ['wusir', 'alex']] 1732315659016

    对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

    深copy

    import copy
    l1 = [1,2,3,['barry','alex']]
    l2 = copy.deepcopy(l1)
    
    print(l1,id(l1))  # [1, 2, 3, ['barry', 'alex']] 2915377167816
    print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2915377167048
    
    l1[1] = 222
    print(l1,id(l1))  # [1, 222, 3, ['barry', 'alex']] 2915377167816
    print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2915377167048
    
    l1[3][0] = 'wusir'
    print(l1,id(l1[3]))  # [1, 222, 3, ['wusir', 'alex']] 2915377167240
    print(l2,id(l2[3]))  # [1, 2, 3, ['barry', 'alex']] 2915377167304

    对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

  • 相关阅读:
    高效DevOps的10项实践
    Qlik Sense Desktop
    CQRS架构
    Scala开发环境搭建与资源推荐
    Scala是一门现代的多范式编程语言
    四种优秀架构
    干净的架构The Clean Architecture
    自动更改IP地址反爬虫封锁,支持多线程(转)
    ActiveMQ源码架构解析第一节(转)
    grails的controller和action那点事---远程调试groovy代码
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8086552.html
Copyright © 2011-2022 走看看