• Python学习day7(集合、深浅copy及易错点)


    集合

    集合的创建

    set1 = {'hyg', '[1, 2], 4, 5}
    set2 = set( {'hyg', '[1, 2], 4, 5})
    

    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

    去重,把一个列表变成集合,就自动去重了。

    l1 = [1, 1, 2, 3, 4, 4, 3, 2, 1, 5, 5]
    set1 = set(l1)
    l2 = list(set1)
    print(l2)
    #结果:[1, 2, 3, 4, 5]
    

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

    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))
    
    set1 = {1, 2, 3, 4, 5}
    set2 = {4, 5, 6, 7, 8}
    # 差集
    print(set1 - set2)
    print(set1.difference(set2))
    
    # 子集
    set1 = {1, 2, 3}
    set2 = {1, 2, 3, 4, 5, 6}
    print(set1 < set2)  # True
    print(set1.issubset(set2))
    
    # 超集
    print(set2 > set1)
    print(set2.issuperset(set1))
    

    集合的增、删(因为集合是无序的,所以没有改和查的方法)

    set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
    set1.add('女神')
    print(set1)
    
    set1.update('abc')  #迭代着加
    print(set1)
    

    set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
    set1.remove('alex')
    print(set1)
    
    set1.pop()    #随机删除一个元素
    print(set1)
    
    set1.clear()   
    print(set1)
    
    del set1
    print(set1)
    

    frozenset()方法:将集合变成不可变集合类型

    set1 = {1, 2, 3}
    set2 = frozenset(set1)
    print(set2) 
    

    深、浅copy

    赋值运算

    l1 = [1,2,3]
    l2 = l1
    l1.append(666)
    print(l2)           #[1, 2, 3, 666]
    print(id(l1))       #2673545598344
    print(id(l2))       #2673545598344
    

    对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。

    浅copy

    l1 = [1, 2, 3, [22, 11]]
    l2 = l1.copy()
    l1.append(999)
    l2[3].append(666)
    print(l1)             #[1, 2, 3, [22, 11, 666], 999]
    print(l2)             #[1, 2, 3, [22, 11, 666]]
    print(id(l1))         #1684921202568
    print(id(l2))         #1684922070088
    print(id(l1[-1]))     #1684891348688
    print(id(l2[-1]))     #1684922070216
    

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

    深copy

    import copy
    l1 = [1, 2, 3, [22, 11]]
    l2 = copy.deepcopy(l1)
    print(l1 is l2)             #False
    print(l1[-1] is l2[-1])     #False
    

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

    易错点

    # 元组
    # 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。
    # tu1 = (1,)
    # tu2 = ('alex')
    # tu3 = ([1,2,3],)
    # print(tu1,type(tu1))
    # print(tu2,type(tu2))
    # print(tu3,type(tu3))
    
    # 列表
    # 列表与列表可以相加
    # l1 = [1,2,3]
    # l2 = ['alex','wusir']
    # l3 = l1 + l2
    # print(l3)
    # print((1))
    #
    # l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    # 将列表中索引为奇数的元素,全部删除
    # 方法一:切片+步长删除
    # del l1[1::2]
    # # print(l1)
    # l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    # for i in range(len(l1)):
    #     print(l1)
    #     print(i)
    #     if i % 2 == 1:
    #         l1.pop(i)
    #     print(l1)
    #     print(i)
    # print(l1)
    
    # 在循环一个列表时,如果对列表中的某些元素进行删除,
    # 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
    
    
    # 方法二:
    # l2 = []
    #
    # for i in range(len(l1)):
    #     if i % 2 == 0:
    #         l2.append(l1[i])
    # print(l2)
    # l1 = l2
    # print(l1)
    # l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    # # 方法三:倒着删除
    # for index in range(len(l1)-1, -1, -1):
    #     if index % 2 == 1:
    #         l1.pop(index)
    # print(l1)
    # 在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。
    
    # 字典
    # fromkeys()
    # dic1 = dict.fromkeys([1,2,3],'alex')
    # print(dic1)
    
    # 陷阱:
    # dic1 = dict.fromkeys([1,2,3],[])
    # print(dic1)
    # # dic1[1].append('alex')
    # print(dic1)
    # print(id(dic1[1]))
    # print(id(dic1[2]))
    # print(id(dic1[3]))
    
    #dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
    # 将 dic的键中含有k元素的所有键值对删除。
    # for key in dic:
    #     if 'k' in key:
    #         dic.pop(key)
    # dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小。
    # l1 = []
    # for key in dic:
    #     if 'k' in key:
    #         l1.append(key)
    # # print(l1)
    # for key in l1:
    #     dic.pop(key)
    # print(dic)
    
  • 相关阅读:
    vue.ps1 报错
    TortoiseGit 图标不显示
    uniapp基本使用
    微信小程序实现一天倒计时
    CSS盒子四周阴影效果
    Vue3中ref通过ref获取真实DOM元素
    WebStrom开发微信小程序,基本配置
    Vue3 之组件 vmodel
    Vue3 在 Elementplus中 vmodel, update:modelValue 线上环境报错
    vue ui 报错
  • 原文地址:https://www.cnblogs.com/hyg19910701/p/9520634.html
Copyright © 2020-2023  润新知