• 基础数据类型(可变)


                                                                                   列表

                                                                                   字典

                                                                                   集合

                                                                        数据类型之间转换

    5. 列表 (list)

    有序和无序

    可以使用索引的数据结构就是有序的,反之则是无序的

    概述

    '''
    列表是存放一些数据的容器(一种数据结构),列表中的元素可以是不同数据类型的元素
    '''

    定义方式

    =号定义

    lst = []

    list()传参

    list('123')

    list参数必须是可迭代对象

    1. append/insert/extend(增加)

    在不改变源数据结构地址的情况下增加  

    1 append(x)
    2 
    3 """
    4 把一个元素添加到链表的结尾,相当于a[len(a):] = [x]
    5 """
    append
    1 insert(i,x)
    2 """
    3 在指定位置插入一个元素,第一个参数是准备插入到其前面的那个元素的索引,第二个参数时想要插入的内容,例如a.insert(0,x)会插入到整个链表之前,而a.inert(len(a):) = [x]相当于a.append(x)
    4 """
    insert
    1 extend(L)
    2 """
    3 通过添加指定链表的所有元素来扩充链表,相当于a[len(a):] = L
    4 """
    extend
     1 lst = ['今天','','','好日',]
     2 lst.append('')
     3 print(lst)     """['今天','是','个','好日','子']"""
     4 
     5  6 #插入     尽量不要使用 当数据量比较大的时候会影响效率
     7 lst.insert(1,'bilibili')    #插在字符下标的前面,插入的内容.
     8 lst = ['今天','','','好日',]
     9 lst.insert(1,'')
    10 
    11 12 #扩展  -- 迭代添加
    13 lst.extend()                #整型和布尔值不可以迭代.
    14 lst = ['今天','','','好日',]
    15 lst.extend('你说的对啊')
    16 lst.extend([12345])
    示例
    1 for x in a[:]: 
    2 # make a slice copy of the entire list ... 
    3     if len(x) > 6: 
    4     a.insert(0, x) 
    5 print(a)
    6 
    7 [’defenestrate’, ’cat’, ’window’, ’defenestrate’]
    不改变源数据

    2. +(合并)

    1 #列表合并     开辟了一块空间
    2 lst1 = [1,2,3]
    3 lst2 = [4,5,6]
    4 print(lst1+lst2)
    示例
    1     def __add__(self, *args, **kwargs): # real signature unknown
    2         """ Return self+value. """
    3         pass
    __add__源码

    3. 删除

    #列表的删除
    #delete # 强制销毁内存空间
    lst = ['今天','是','个','好日',]
    del lst                 #删除了整个列表,不可以
    del lst[1]              #可以配合下标删除
    del lst[0:2]            #可以配合切片删除
    del lst[0:3:2]          #可以配合步长删除

    lst.remove('今天')
    print(lst)              #通过内容删除

    lst.pop()               #没有指定,默认删除最后一个   具有返回值
    lst.pop(0)              #可以指定索引删除   不可以通过切片进行删除
    ret = lst.pop(0)
    print(ret)              #返回的是"今天",   返回被删除的内容

    lst.clear()             #清空列表里的内容   返回的是空列表

    #错误示范 用for循环清空列表
    li = [1,2,3,4,5]
    #li = [1,2,3,4,5,0,0,0,0,0,0,0,0,0]
    for i in li:
    li.append(0)
    print(li)        #一直在循环

    li = [12,2,3,4,5]
    for i in li:
    li.append(i)
    print(li)       #一直进行循环

    li = [1,2,3,4,5]
    for i in li:
    li.remove(i)
    print(li)   # 结果[2,4] 列表会整个前移 完美错过2,4

    for i in li:
    li.pop()
    print(li)   #结果[1,2]   循环1,2删除4,5 循环3的时候自删

    li = [1,2,3,4,5]
    for i in li:
    del li[-1]
    print(li)    #结果[1,2]

    4. 改

    # 在内存中开辟空间,值为字符串'我怎么这么好看',在源列表的基础上将之前索引为0的元素指向新的字符串的内存地址
    lst = ['今天','是','个','好日',]
    lst[0] = '昨天           #通过下标修改.
    print(lst)

    lst[0:3] = 'xi'                  #通过切片修改
    print(lst)                       #元素可以超出切片定义的位数,且被迭代添加到起始位置

    lst[0:3:2] = 'xi' #通过切片加步长更改,长度要一一对应,
    print(lst)

    5. 查找

    索引查找

    lst = ['年后','来玩呗',1,2,3]
    print(lst)
    print(lst[0])       #从列表中取出hello
    print(lst[0][1])    #从列表中取出'后'

    for 循环查找

    lst = ['今天','是','个','好日',]
    for i in lst:
       print(i)    
    print(lst[1])

    6. 通过内容找索引

      #通过内容找下标
    lst = ['今天','是','个','好日',]
    ret = lst.index('今天')          
    print(ret)

    7. 统计

    #统计
    print(lst.count('天'))  

    8. 复制

    #复制
    ret = lst.copy()
    print(ret)

    9. 反转

     #反转
    lst = [1,2,3,4453,5,6,7]
    print(lst[::-1])
    lst.reverse()  # 反转
    print(lst)

    lst = [1,2,3,4,5123,21345,231123,4,1235,234,123]
    lst.sort()
    lst.reverse()
    print(lst)
    ret = lst.reverse()

    print(ret)                       #None 这是一个动作,没有返回的内容
    print(lst)                       #变化的内容在原数据里查看

    10. 排序

    # 排序(默认升序)
    lst = [1,2,34,5,6]               #数字从小到大排序
    lst = ['a','c','b','e']          #字母从a到z排序
    lst = ['今天','是','个','好日',]  #ascii 的排序
    lst.sort()                      
    print(lst)

    #降序
    lst.sort(reverse = True)        
    print(lst)

    11. 嵌套

    #列表嵌套
    lst = ['a','b','c'['bb','cc'['e','ee']]]
    print(lst[2][1])

    7. 字典 (dict)

    定义方式
    dic = {}
    dict(k=1,k1=2)
    #在其他语言中叫键值对数据,用来存储数据,字典的查找快一些将数据与数据进行关联
    #字典是无序的   是可变的数据类型
    #呈现形式:dict dic={'键','值'}
    #不可哈希的,就是可变的数据;可变的数据不能哈希,不可变的数字能哈希   避免哈希冲突 使用了 (开放了寻址法)
    #字典的键:是不可变数据类型
    dic = {'02':a,'04':b,6:'c',False:'d',(1,2):'e'}
    print(dic)
    dic = {'02':a,'04':b,6:'c',False:'d',(1,2):'e','04':dd}
    print(dic)      #字典的键不能重复,重复的话就会被值覆盖

    dic = {'02':a,6:'c',False:'d',(1,2):'e'}
    print(dic)      #字典的值可以随意   有键必须要有值
       
    dic = {'1':8,'2':9,'3':7}
    ret = dic.get('11',你傻啊,没有还要拿)
    print(ret)      #本应返回None,后面加内容后返回内容你傻啊,没有还要拿
    ret = dic.pop('11','没有')
    print(ret)      #本应报错, 后面加内容后返回内容没有
           

    #####################z这是坑#########################
    dic3 = dict.fromkeys([1,2,3,4,5,6,7,8,9,0],[1,2,3])
    #第一个参数是键 要是可迭代的对象
    #第二个参数是值, 值是无所谓   是因为创建的新字典的值用的都是一个 值是一个可变数据类型
    print(dic3)
    dic3[3].append(9)
    print(dic3)

    ########################这是坑#########################

    1. 增

    #字典的增
    dic = {'02':a,6:'c',False:'d',(1,2):'e'}
    dic[11] = 'gg'    #暴力添加
    print(dic)

    dic.setdefault(11,'gg')    #第一步先去字典中通过11这个键去查有没有值,第二步如果有值就不去添加,如果没有值就添加新的键和值
    #python3.6版本以上,字典默认是有序的,怎么写的怎么打印.但是对外声称字典是无序的

    #fromkeys 批量添加键值对  
    dic = {'1':'a','2':'b'}
    dic = dic.fromkeys('年后啊','消愁')
    #或者
    dic = dict(空字典).fromkeys('年后啊','消愁')
    第一个位置是可迭代对象,也就是字典的键
    第二个位置 不写是None  也就是字典的值

    dic = dic.fromkeys('年后啊','消愁')
    print(dic)   #{'年':'消愁','后':'消愁','啊':'消愁'}

    dic['年'] = '今天老子不上班'   # 字符串不能修改
    print(dic)

    dic = dic.fromkeys('年后啊','消愁')
    dic['年'] = '今天老子不上班'
    print(dic)     #{'年':'老子今天不上班','后':'消愁','啊':'消愁'}

    dic = dict.fromkeys('你好啊',[1,2,3])
    print(dic)
    dic['你'] = [5,6,7]
    print(dic)

    dic = dict.fromkeys('你好啊',[1,2,3])
    print(dic)
    dic['你'].append(99)
    print(dic)

    2. 删

    #字典的删除    #通过键删除
    del dic[6]
    dic.pop(6)      #pop(必须填内容) 通过指定键删除   返回的是被删除键的值

    dic.clear()     #清空

    #随机删除
    dic.popitem()   #python2版本中随机删除   在python3.6以上中默认删除最后一个   返回的是键值对

    #清空字典
    dic = {'1':22,'5':'22'}
    for i in dic:
    dic['6'] = 1       # 不可以
    print(dic)

    lst = []               #可以
    for i in dic:
    lst.append(i)   # 每个字典的键  
    for j in lst:
    dic.pop(j)
    print(dic)

    for i in li:
    li.clear()                  # 实在不行的可以写这个
    print(li)

    3. 改

    #字典的更改
    dic.update({'55':'gg'})    #更新   被更新的内容如果在要更新的内容中,那值就会被覆盖.   两个字典中都没有就会合并.

    dic = {'02':a,[0,4]:b,6:'c',False:'d',(1,2):'e'}
    dic[11] = 'gg'
    print(dic)        #字典的增是字典中没有键值对的时候才叫增,如果字典中的键存在就叫做改
    dic = {'02':a,[0,4]:b,6:'c',False:'d',(1,2):'e'}
    dic1 = ({'55':'gg'})
    dic1.update(dic)      #括号里的字典要高于其他字典
    print(dic1)

    4. 查

    #字典的查
    dic = {'02':a,6:'c',False:'d',(1,2):'e'}
    print(dic['02'])          #值的查找   通过键查找值 如果键不存在报错

    for i in dic1:
       print(i)              #获取的都是字典的键

    print(dic['02'])    #通过键获取值   如果键不存在就报错

    print(dic.get('02'))      #通过键查找获取值   如果键不存在返回None
    print(dic.setdefault('02'))#如果不存在返回None
    5. 嵌套
    #字典的嵌套
    dic = {'汪峰':{'光头强':'电锯','葛慧倩':'熊大','国际章':'熊二'},
          '陈冠希':{'张柏芝':'喜剧之王','阿娇':'千机变'},
          '韦小宝':{'建宁':'公主','龙儿':'教主夫人',
                 '双儿':{'大双':'榴莲','小双':'椰子'},'阿珂':'刺客'}}
    #查找的时候一层一层通过键查找
    dic1 = dic['陈冠希']['阿娇']    #找出千机变
    print(dic1)
    print(dic['韦小宝']['双儿'])     #找出一对
    print(dic['韦小宝']['双儿']['小双'])   #找出椰子

    6. 其他操作

    #字典的其他操作
    #字典定义方法:dict(k='a',k1='b')
    for 循环 返回的是键

    for i in dic:
       print(dic.get(i))  # 通过键获取值,如果将不存在字典中返回None
       
    print(dic["cx"])      # 通过键获取值,如果键不存在字典中报错
       
    for i in dic.keys():    #只拿到键
       print(i)
       
    print(dic.keys())    #dict_keys([])   高仿列表支持for循环 不能使用索引
    print(dic.values)    #dic_values([]) 高仿列表支持for循环   不能使用索引

    for i in dic.keys():    #只拿到键   存在一个高仿列表中
       print(i)

    for i in dic.values():
       pritn(i)         #拿到每个值   存在一个高仿列表中
       
    for i in dic:
       print(i,dic[i])    #拿到了键值   存在一个3高仿列表中以元祖的形式显示

    for i in dic.items():
       print(i)           #拿到了键值对 存在高仿列表中以元祖的形式显示

    7. 解构

    # 解构
    a,b,c = 1,2,3
    print(a)
    print(b)
    print(c)

    a,b,c = '123'
    print(a)
    print(b)
    print(c)

    a,b,c = (1,2,3)
    print(a)
    print(b)
    print(c)

    a,b,c = [1,2,3]
    print(a)
    print(b)
    print(c)

    a,b,c = {'1':8,'2':9,'3':7}
    print(a)
    print(b)
    print(c)

    #数字和布尔值必须用逗号分割

    keys()   # 获取所有的键   高仿列表

    values()  # 获取所有的值   高仿列表

    item()   # 获取键值 以元祖的形式显示

    for k,v in dic2.items():   # k,v = ('33','gg')
      print(k)
      print(v)

    8. 集合

    特点

    当集合中的元素都为数字时,集合为有序的,排序方式为从小到大

     

    定义方式

    se = {'a','b'}
    set('alex')   #迭代添加进集合
    set  #集合的特点: 存储数据   天然去重 无序 不能使用下标

    se = {1,2,3,4,52,234,12,21,12,123,1,11,2,3,1,2,3,21}    # 集合像是没有值得字典
    print(se)

    dic = {}
    # dic.setdefault('123','nihao')
    # print(dic)

    1. 增

    #集合的增
    se.add(6)     #只能增一个
    print(se)

    se.update(["12334"])   # 可迭代对象
    print(se)

    2. 删

    #集合的删
    se.clear()
    se = {1,2,3,4}
    print(se.pop())     #删的是第一个,以为集合是无序的所以自己也不知道删的是哪个

    s1 = {"刘能", "赵四", "皮歌藏"}
    s1.remove('刘能')      # 通过内容删除

    del se

    3. 改

    #改
    先删后加

    4. 查

    #查
    for循环
    for i in set:
       print(i)

    注意:只能在cmd(终端)中使用

    5.冻结集合

    s1 = {'冯乡长', '刘能', '赵四', '刘科长'}
    print(frozenset(s1))
    print(frozenset(s1))
    print(frozenset(s1))
    # {'刘能', '冯乡长', '刘科长', '赵四'}
    # {'刘能', '冯乡长', '刘科长', '赵四'}
    # {'刘能', '冯乡长', '刘科长', '赵四'}

    将集合冻结,可作为字典的键
    dic = {{'冯乡长', '刘能', '赵四', '刘科长'}:1}
    #dic = {{'冯乡长', '刘能', '赵四', '刘科长'}:1}
    #TypeError: unhashable type: 'set'



    dicq = {frozenset({'冯乡长', '刘能', '赵四', '刘科长'}):1}

    6..交叉并集,反交集

    s1 = {"刘能", "赵四", "皮歌藏"}
    s2 = {"刘科长", "冯乡长", "皮歌藏"}

    print(s1 & s2)  # 俩个都有的叫交集
    print(s1 | s2)  # 两个合并叫并集
    print(s1 - s2)  # 不显示共有的叫差集
    print(s1 ^ s2)  # 显示不共有的叫反交集

    print(s1 < s2)  #子集   返回布尔值
    print(s1 > s2)  #超集   返回布尔值

     

    9. 数据类型总结

    list是链表
    set 是hash表
    # 不可变数据:(内存地址不可以被改变)
    字符串,数字,布尔值,元祖
    # 可变数据:(内存地址可以被改变)
    列表,字典,集合
    # 有序的数据: (定义时是什么顺序,输出时就是什么顺序)
    列表,元组,字符串,整型,布尔值
    # 无序的数据: (定义时是什么顺序,输出时不是定义时的顺序)
    字典,集合
    #取值方式:
       索引:  字符串 列表 元祖
       直接:  集合  整型  布尔值
       键:   字典
    1.小数据池:
       1.1代码块: 一个文件,一个函数,一个类,一个模块,终端中每一行
          1.1.1 数字: -5 ~ 256
          1.1.2 字符串: 乘法时总长度不能超过20
          1.1.3 布尔值: 内容相同内存地址相同
       1.2 小数据池:
          1.2.1 数字: -5 ~ 256
          1.2.2 字符串: 乘法时总长度不能超过20
          1.2.3 布尔值: 内容相同内存地址相同
       1.3 先执行代码块后执行小数据池
       1.4 == is
           1.4.1 == 判断等号两边值是否相等
           1.4.2 is 判断两边的值内存地址是否相等

    2.深浅拷贝
       2.1 赋值:
           多个变量名指向同一个内存地址
           一个变量对其进行操作,其他变量查看时都变动
       2.2 浅拷贝:
           lst[1:10] -- 是浅拷贝
           浅拷贝只拷贝第一层元素
           修改第一层元素是,新开辟的不进行改变
       2.3 深拷贝:
           不可变的数据类型共用,可变的数据类型重新开辟一个空间
           对源数据进行修改,深拷贝的内容不进行改变

    3. 集合
       3.1 集合是没用值得字典
       3.2 集合是无序,可变的
       3.3 集合天然去重
       3.4
           增:add ,update
           删:pop remove clear
           改:先删后加
           查: for循环
       3.5 其他操作:
           & 交集
           | 并集
           - 差集
           ^ 反交集
           > 超集
           < 子集
           frozenset()  冻结集合
       3.6 面试题:
           list(set(要去去重的数据))

    10. 数据类型之间的转换

    #list 转换 tuple
    tuple(list)

    #tuple 转换 list
    list(tuple)

    #str 转换 list
    name = "alex"  print(name.split())

    #list 转换 str
    lst = ["1","2","3"]     print(''.join(lst))

    #dict 转换 str
    dic = {"1":2}
    print(str(dic),type(str(dic)))
    print(dict("{1:1}"))

    #set 转换 list
    list(set)

    #list 转换 set
    set(list)
  • 相关阅读:
    MarkDowdPad 破解
    VimFaultException A specified parameter was not correct configSpec.guestId
    did not finish being created even after we waited 189 seconds or 61 attempts. And its status is downloading
    nsx-edge虚拟机抓包实践
    检查子网内存活的主机
    测试防火墙源端口
    vmware创建虚拟机不识别网卡
    ovs-qos配置
    ovs之组网实验
    openstack镜像制作
  • 原文地址:https://www.cnblogs.com/qidaii/p/12767926.html
Copyright © 2020-2023  润新知