zoukankan      html  css  js  c++  java
  • 基础数据类型之集合和深浅copy,还有一些数据类型补充

                          集合

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

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

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

    #关于集合和波尔值之间的苟苟且且
    # set ={1,2,3,4,5,True,(1,2,3),} #集合具有自动去重和去空格功能
    # set.add(False)
    # set.add(True) #打印结果显示,没有Teue,应该是集合内部的数字和元组不是空是True,去重就把True去掉了
    # print(set)

    # set.update(False) #update是随机迭代增加,布尔值不是迭代对象,所以只能用add增加
    # print(set)
    # set.update(True)
    # print(set)

    #删除
    # set = {1,2,3,4,5,(789),6}
    # set.pop() #随机删除,有返回值
    # print(set)

    #交集
    # set = {1,2,3,4}
    # set1 = {3,4,5,6,7}
    # print(set.intersection(set1))
    # print(set&set1)

    #并集 并集也可以去两个集合的重
    # set = {1,2,3,4}
    # set2 = {3,4,5,6,7,8}
    # print(set.union(set2))
    # print(set|set2)

    #差集
    # set = {1,2,3,4,5}
    # set3 = {4,5,6,7}
    # print(set.difference(set3))
    # print(set - set3)

    #反交集 #两个集合相同的去掉
    # set = {1,2,3,4,5}
    # set4 = {4,5,6,7,8}
    # print(set.symmetric_difference(set4))
    # print(set ^ set4)

    #超集 子集
    # set = {1,2,3,4}
    # set5 = {1,2,3,4,5,6,7}
    # print(set5.issuperset(set)) #判断set5是不是set的爸爸,返回波尔值
    # print(set.issubset(set5)) #判断set是不是set5的儿子,返回波尔值
    # print(set5 > set)
    # print(set < set5)

    #把集合冻住,使其成为不可变数据类型
    # set = {1,2,3,4,5,6}
    # print(frozenset(set))

    深浅copy

    浅copy  通过赋值之后,两个值内存地址不同,在数据有嵌套的情况下,嵌套部分内存地址相同,无论嵌套多少层都一样

    深copy必须调用copy模块才能使用  import copy    deepcopy     深copy就是通过赋值之后,值得内存地址完全不同,无论嵌套多少层都一样

    基础数据类型补充

    现在我莫名其妙有一个需求dic = {'k1':'v1','k2':'v2','a3':'v3'},我现在看着字典不顺眼,准备收拾它,就想着把它的带元素k的键删掉怎么办

    按照正常思路来一下,这个字典有多大咱们不知道,也许里面储存了上亿的带k大军,所以我用循环删

    dic = {'k1':'v1','k2':'v2','a3':'v3'}

    for i in dic:

      if 'k' in i:

        del dic[i]

    print(dic)

    结果报错,说是字典长度改变了。。。我觉得废话,我要删除长度肯定改变啊,总之不让删咋整。。。

    然后,我踩在前人的肩膀上抄了这样一份代码解决了问题

    # dic = {'k1':'v1','k2':'v2','a3':'v3'}
    # l = []
    # for i in dic:
    # if 'k' in i:
    # l.append(i)
    # for i in l: #关键在这里和下面,执行的是循环列表,但是删除的是字典,无耻啊
    # del dic[i] #现在字典可以删除,因为现在不是边循环字典边删除,而是先判断出字典的带k大军放到列表里,循环列表就相当于循环字典带k大军,此时字典的带k大军就被删除了
    # print(dic)
    然后我又抄了第二份。。。
    # dic = {'k1':'v1','k2':'v2','a3':'v3'}
    # dic1 = {}
    # for i in dic.keys():
    # if 'k' not in i:
    # dic1.setdefault(i,dic[i])
    # dic = dic1
    # print(dic)


    经过我一些神神叨叨的实验,得出以下结论

    列表
    当循环列表时,如果在循环中删除某个或者某些元素,列表元素个数改变,索引改变,容易出错。
    列表这个在循环删除的时候可以从后往前删除,这样前面的索引不会变化,至于后面的那就无所谓了,后面改变也不影响循环

    字典
    当循环字典时,如果在循环中删除某个或者某些键值对,字典的键值对个数改变,长度改变,容易出错。

     

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/ddjl/p/8086915.html
Copyright © 2011-2022 走看看