• Python 列表和元组


    1,数据结构基本知识

    数据结构是以某种方式(例如编码) 组合起来的数据元素(数字 字符 和其他数据)的汇集体,最为基本的数据结构,称之为序列(sequence)

    其中,在Python中,我们常见的数据类型和数据结构如下:

    数据类型:

    • 整数型 int()    : 数字的整数 
    • 浮点型 float() : 数字带小数
    • 字符串 str()    : 用 ‘’ 或者 “” 引用的任意文本
    • 布尔型bool()  : True 和 False

    数据结构分为:           # 数据结构 可以相互嵌套,参见2.1示例

    • 列表 list            : 可以修改,使用方括号表示,逗号区分各个子元素,其中字符串需 单引号或 双引号区分  ["你好","中国",2018,"改革开放40周年"]
    • 元祖 tuple         :不可以修改,使用圆括号表示,
    • 字典 dict           :
    • 集合 set            :

    本次,主要讲述列表与元组的知识.

    2.列表内容

    2.1 列表基础知识

    • 列表,,使用方括号表示,逗号区分各个子元素,其中字符串需 单引号或 双引号区分  ["你好","中国",2018,"改革开放40周年"]
    lst1 = ["你好","中国",2018,"年,改革开放40周年"]
    lst2 = ["反法西斯","胜利",73,"周年"]
    lst3 = lst1 +lst2             # 列表相加,也就是合并
    lst4 = [lst1 +lst2]           # 嵌套两个列表
    print(lst3)
    print(lst4)
    • 效果如下:
    ['你好', '中国', 2018, '年,改革开放40周年', '反法西斯', '胜利', 73, '周年']
    [['你好', '中国', 2018, '年,改革开放40周年', '反法西斯', '胜利', 73, '周年']]

    2.2 列表操作:

    • 索引 list[X] :列表中,各个子元素位置自0开始,list[x]表示第几位元素,此称之为 索引(indexing)

    lst1 = ["你好","中国",2018,"年,改革开放40周年"]
    lst2 = lst1[1]
    print(lst1[0])
    print(lst2)
    print(type(lst1[0]))
    print(type(lst1[2]))


    效果如下:
    你好
    中国
    <class 'str'>
    <class 'int'>
    • 切片 slicing : 使用切片来访问特定范围内的元素,为此,可使用2个索引和冒号分割,来定位具体元素
    lst1 = ["你好","中国",2018,"年,改革开放40周年"]
    lst2 = lst1[1:2]        # 方括号内的索引,表示自左向右,顾头不顾尾的选取.
    print(lst2)
    print(type(lst2))
    lst3 = lst1[1:]        # 方括号内的第二位数字为空,表示自左向右,自第"1"位开始索引,至结束.
    print(lst3)
    lst4 = lst1[:3]        # 方括号内的第一位数字为空,表示自左向右,自起始开始索引,至结束第3-1=2位前结束.
    print(lst4)
    lst5 = lst1[1:-2]      # 表示自左向右,自第"1"开始索引,至结束第-2位前结束.
    print(lst5)
    lst6 = lst1[2:-2]      # 表示自左向右,自第"2"开始索引,至结束第-2位前结束..
    print(lst6)
    lst7 = lst1[0:5:2]      # 最后一个2,表示步长意思,跳过选取..
    print(lst7)
    lst8 = ["反法西斯","胜利",73,"周年"]
    print(lst1 + lst8)      # 列表相加
    print(2 * lst8)         # 列表乘法
    print(lst8 * 2)         # 列表乘法

    效果如下:
    ['中国']
    <class 'list'>
    ['中国', 2018, '年,改革开放40周年']
    ['你好', '中国', 2018]
    ['中国']
    []
    ['你好', 2018]
    ['你好', '中国', 2018, '年,改革开放40周年', '反法西斯', '胜利', 73, '周年']
    ['反法西斯', '胜利', 73, '周年', '反法西斯', '胜利', 73, '周年']
    ['反法西斯', '胜利', 73, '周年', '反法西斯', '胜利', 73, '周年']
    • 成员资格 in  : in 是成员资格运算符,它检查是否满足指定条件,并返回True 或Flase
    lst1 = ["你好","中国",2018,"年,改革开放40周年"]
    lst2 = ["你好"]
    str1 = "你好","中国",2018,"年,改革开放40周年"
    str2 = "你好"
    lst3 = lst1[0]
    print(lst2 in lst1)          # 列表成员资格审查,显然不支持列表与列表的in 资格审查
    print(lst2 == lst3)          # 列表成员资格审查,显然不支持列表与列表的比较
    
    print(str2 in str1)          #字符串的资格审查,显然支持字符串的资格审查
    print(str2 == str1[0])       #字符串的比较运算,显然支持字符串的比较运算
    print(str1[0])               #字符串1的索引
    print(str2[0])               #字符串2的索引
    print("----完美分割线-----")
    print(len(str1))             #len()函数在字符串的应用
    print(len(lst1))             #len()函数在列表的应用


    效果如下:
    False
    False
    True
    True
    你好
    你
    ----完美分割线-----
    4
    4
    • list() 字符串转列表   可以实现     修改列表   删除元素    赋值元素等工作
    import string
    
    # join函数在string 中
    
    str1 = "你好", "中国", 2018, "年,改革开放40周年"
    str2 = "你好"
    str3 = "*手牵手*"
    str8 = ","
    lst4 = ["你好", "中国", 2018, "年,改革开放40周年"]
    lst1 = list(str1)  # 字符串转成列表,结果以列表生成
    lst2 = list(str2)  # 字符串转成列表,结果以列表生成
    print(lst1)
    print(lst2)
    str4 = str3.join(str2)  # 将str3合并str2中,结果以字符串生成
    print(str4)
    str5 = str3.join(str(x) for x in lst4)  # 将str3合并到lst4中,结果以字符串形式生成
    print(str5)
    str6 = str8.join(str(x) for x in lst4)  # 将str8合并到lst4中,结果以字符串形式生成
    print(str6)

    效果如下:

    ['你好', '中国', 2018, '年,改革开放40周年']
    ['', '']
    你*手牵手*好
    你好*手牵手*中国*手牵手*2018*手牵手*年,改革开放40周年
    你好,中国,2018,年,改革开放40周年



    • list修改元素/ 删除元素 切片赋值和一系列方法
    lst1 = ["python","java","c++","vb"]
    lst1[1] = "Basic"
    print(lst1)
    lst1[1] = 2018
    print(lst1)
    lst1 = lst1*3                      # 下一个代码将给列表1的第11位赋值修改为2019,但目前lst1没有底11位,因此重新定义列表大小
                                       # None 空列表与初始化   按要求,不允许给予列表超出位置赋值,因此初始化空列表可以用 lst=[] ,如果创建10位的空,可以用[]*10表示.或者[None]*10
    print(lst1)
    lst1[10] = 2019                     # 变值第10位 为2019
    print(lst1)
    print("*****完美分割线*****")
    print(len(lst1))
    del lst1[1]                          # 删除第1位  java
    print(lst1)
    print(len(lst1))


    效果如下:
    ['python', 'Basic', 'c++', 'vb']
    ['python', 2018, 'c++', 'vb']
    ['python', 2018, 'c++', 'vb', 'python', 2018, 'c++', 'vb', 'python', 2018, 'c++', 'vb']
    ['python', 2018, 'c++', 'vb', 'python', 2018, 'c++', 'vb', 'python', 2018, 2019, 'vb']
    *****完美分割线*****
    12
    ['python', 'c++', 'vb', 'python', 2018, 'c++', 'vb', 'python', 2018, 2019, 'vb']
    11

    切片是一个极其强大的功能,能够给切片赋值,使得列表具备更大的弹性,最为重要的是 在不改变列表元素的情况下(有可能位置变动),增加新元素


    lst1 = ["中国", "美国", "日本", "加拿大"]
    lst2 = ["中国", "美国", "日本", "加拿大"]
    lst1[1:2] = ["美国", "欧盟"]
    print(lst1)
    lst1[1] = "欧盟"
    print(lst1)
    lst1[1] = "美国", "欧盟"  # 针对某一位列表元素,但赋值两个字符串,将以元组格式插入
    print(type(lst1[1]))
    print(lst1)
    lst1[1:2] = "美国", "欧盟"
    print(lst1)
    lst1[-1:-2] = "美国", "欧盟"
    lst2[-2:-1] = "美国", "欧盟"
    print(lst1)
    print(lst2)
    lst2[-2:-1] = "美国", "欧盟"
    print(lst2)
    print(type(lst1[-2]))
    lst2[-2] = []  # 针对某一位列表元素,但赋值两个字符串,将以元组格式插入
    print(lst2)
    print(lst1)
    lst2[1:-2] = []  # 将1- -2位赋值为空列表
    lst2[1] = "2"
    print(type(lst2[1]))
    lst2[1] = 1
    print(type(lst2[1]))
    lst1[1:-2] = ""  # 将1- -2位赋值为空
    print(lst2)
    print(lst1)
    print(len(lst1))
    print("*****完美分割线1******")
    
    lst1 = ["中国", "美国", "日本", "加拿大"]
    lst2 = lst1.append("德国")  # append 函数 就地添加对象元素到 列表 末尾,返回none
    print(lst1)
    print(lst2)
    print("*****完美分割线2******")
    lst3 = ["中国", "美国", "日本", "加拿大"]
    lst4 = lst3.clear()  # clear 函数 就地添加清空列表,返回none
    print(lst3)
    print(lst4)
    
    print("*****完美分割线3******")
    lst5 = ["中国", "美国", "日本", "加拿大"]
    lst6 = lst5  # 改变其中一个会改变另一个值
    print(lst6)
    lst6[1] = "欧盟"
    print(lst6)
    print(lst5)
    print("*****完美分割线4******")
    lst5 = ["中国", "美国", "日本", "加拿大"]
    lst7 = lst5.copy()  # copy 常规复制,只是将一个表关联到另外一个表,不会改变其值
    print(lst5)
    lst7[1] = "欧盟"
    print(lst7)
    print(lst5)
    print("*****完美分割线5******")
    print(lst5.count("中国"))  # count 只能统计一层的数据出现次数
    lst8 = ["中国", "美国", "日本", ["中国", "加拿大"]]
    print(lst8.count("中国"))
    print("*****完美分割线6******")
    lst5 = ["中国", "美国", "日本", "加拿大"]
    lst6 = ["中国", "美国", "日本", "加拿大"]
    lst10 = lst5.extend(lst6)  # extend 就地扩展括号中的列表到前面引用的列表中,返回None
    print(lst10)
    print(lst5)
    print("*****完美分割线7******")
    lst14 = ["中国", "美国", "日本", "加拿大"]
    lst15 = ["中国", "美国", "日本", "加拿大"]
    print(lst14 + lst15)  # 常规拼接
    print(lst14)  # 常规拼接,不改变原表
    
    print("*****完美分割线8******")
    lst11 = ["中国", "美国", "日本", "加拿大"]
    lst12 = ["中国", "美国", "日本", "加拿大"]
    lst11[len(lst11):] = lst12  # 切片赋值,效果与extend一致
    print(lst11)
    lst13 = ["中国", "美国", "日本", "加拿大"]
    lst13[len(lst13):] = lst13
    print(lst13)
    print("*****完美分割线9******")
    
    lst17 = ["中国", "美国", "日本", "加拿大"]
    
    print(lst17.index("中国"))  # index 返回查找的给定值 在列表中 出现的第一次索引位置
    
    lst18 = ["中国", "美国", "日本", "加拿大"]
    
    print(lst18.insert(1, "中国"))  # insert 将给定值 根据给定的位置索引,添加进列表,返回值 none
    lst18.insert(1, "中国")
    print(lst18)  # 原表已被修改,返回完整列表
    
    print("*****完美分割线10******")
    lst20 = ["中国", "美国", "日本", "加拿大"]
    lst20.pop(2)  # pop 将根据给定的位置索引,删除列表元素,唯一一个列表返回非none值的方法,默认删除最后一个元素.
    print(lst20)
    
    lst21 = ["中国", "美国", "日本", "加拿大"]
    lst22 = lst21.pop()  # pop 将根据给定的位置索引,删除列表元素,唯一一个列表返回非none值的方法,默认删除最后一个元素.
    print(lst22)
    print(type(lst22))  # pop 默认删除最后一个元素.返回值为字符串
    
    print("*****完美分割线11******")
    lst23 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst24 = lst23.remove("加拿大")    # remove 将根据给定的"值",删除列表中,第一次出现的位置的元素,返回none值.
    print(lst23)
    print(lst24)
    print(type(lst24))
    print("*****完美分割线12******")
    lst25 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst26 = lst25.reverse()    # reverse 将根据给定的列表,反顺序排列.返回none 值
    print(lst25)
    print(lst26)
    print(type(lst26))
    print("*****完美分割线13******
    ")
    lst27 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst28 = lst27.sort()    # sort将根据给定的列表,就地排序.返回none 值,相当于直接改原表,因此如果需要改变副本,原表不变,只能用下下的代码
    print(lst27)
    print(lst28)
    print(type(lst28))
    
    lst29 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst30 = lst29.copy()   # 使用copy ,保留lst29的原始表,lst30直接修改,
    lst30.sort()
    print(lst30)
    print(lst29)
    
    lst29 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst30 = sorted(lst29)   # 使用sorted函数 ,直接将排序结果给lst30,保留lst29的原始表,lst30是返回结果,
    print(lst30)
    print(lst29)
    
    str1 = "中国"
    str2 = sorted(str1) # 字符串同样可以使用sorted函数 ,直接将排序结果给str2,保留str1的原始字符串,str2是列表形式返回.
    print(str2)
    print(str1)
    print(type(str2))
    print(type(str1))
    
    print("*****完美分割线14******
    ")
    
    
    lst31 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst32= lst31.sort( key = len)    # 高级排序,探索sort()内部的关键参数 key
    print(lst31)
    print(lst32)
    print(type(lst32))
    
    lst33 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst34 = sorted(lst33,key = len)   # 高级排序,探索sorted()内部的关键参数 key
    print(lst34)
    print(lst33)
    
    print("*****完美分割线15******
    ")
    
    
    lst35 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst36= lst35.sort( reverse = True)    # 高级排序,探索sort()内部的关键参数 reverse
    print(lst35)
    print(lst36)
    print(type(lst36))
    
    lst37 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst38 = sorted(lst37,reverse = False)   # 高级排序,探索sorted()内部的关键参数 reverse
    print(lst38)
    print(lst37)
    print(type(lst38))
    
    lst39 = ["中国", "美国","中国" ,"日本", "加拿大"]
    lst40 = sorted(lst39,reverse= "加拿大")   # 高级排序,探索sorted()内部的关键参数 key
    print(lst40)
    print(lst39)
    print(type(lst40))



    效果如下:
    ['中国', '美国', '欧盟', '日本', '加拿大']
    ['中国', '欧盟', '欧盟', '日本', '加拿大']
    <class 'tuple'>
    ['中国', ('美国', '欧盟'), '欧盟', '日本', '加拿大']
    ['中国', '美国', '欧盟', '欧盟', '日本', '加拿大']
    ['中国', '美国', '欧盟', '欧盟', '日本', '美国', '欧盟', '加拿大']
    ['中国', '美国', '美国', '欧盟', '加拿大']
    ['中国', '美国', '美国', '美国', '欧盟', '加拿大']
    <class 'str'>
    ['中国', '美国', '美国', '美国', [], '加拿大']
    ['中国', '美国', '欧盟', '欧盟', '日本', '美国', '欧盟', '加拿大']
    <class 'str'>
    <class 'int'>
    ['中国', 1, '加拿大']
    ['中国', '欧盟', '加拿大']
    3
    *****完美分割线1******
    ['中国', '美国', '日本', '加拿大', '德国']
    None
    *****完美分割线2******
    []
    None
    *****完美分割线3******
    ['中国', '美国', '日本', '加拿大']
    ['中国', '欧盟', '日本', '加拿大']
    ['中国', '欧盟', '日本', '加拿大']
    *****完美分割线4******
    ['中国', '美国', '日本', '加拿大']
    ['中国', '欧盟', '日本', '加拿大']
    ['中国', '美国', '日本', '加拿大']
    *****完美分割线5******
    1
    1
    *****完美分割线6******
    None
    ['中国', '美国', '日本', '加拿大', '中国', '美国', '日本', '加拿大']
    *****完美分割线7******
    ['中国', '美国', '日本', '加拿大', '中国', '美国', '日本', '加拿大']
    ['中国', '美国', '日本', '加拿大']
    *****完美分割线8******
    ['中国', '美国', '日本', '加拿大', '中国', '美国', '日本', '加拿大']
    ['中国', '美国', '日本', '加拿大', '中国', '美国', '日本', '加拿大']
    *****完美分割线9******
    0
    None
    ['中国', '中国', '中国', '美国', '日本', '加拿大']
    *****完美分割线10******
    ['中国', '美国', '加拿大']
    加拿大
    <class 'str'>
    *****完美分割线11******
    ['中国', '美国', '中国', '日本']
    None
    <class 'NoneType'>
    *****完美分割线12******
    ['加拿大', '日本', '中国', '美国', '中国']
    None
    <class 'NoneType'>
    *****完美分割线13******
    
    ['中国', '中国', '加拿大', '日本', '美国']
    None
    <class 'NoneType'>
    ['中国', '中国', '加拿大', '日本', '美国']
    ['中国', '美国', '中国', '日本', '加拿大']
    ['中国', '中国', '加拿大', '日本', '美国']
    ['中国', '美国', '中国', '日本', '加拿大']
    ['', '']
    中国
    <class 'list'>
    <class 'str'>
    *****完美分割线14******
    
    ['中国', '美国', '中国', '日本', '加拿大']
    None
    <class 'NoneType'>
    ['中国', '美国', '中国', '日本', '加拿大']
    ['中国', '美国', '中国', '日本', '加拿大']
    *****完美分割线15******
    
    ['美国', '日本', '加拿大', '中国', '中国']
    None
    <class 'NoneType'>
    ['中国', '中国', '加拿大', '日本', '美国']
    ['中国', '美国', '中国', '日本', '加拿大']
    <class 'list'>
    ['美国', '日本', '加拿大', '中国', '中国']
    ['中国', '美国', '中国', '日本', '加拿大']
    <class 'list'>

    元组 元组相对于列表,不可修改,因此元组少了一些方法,但元组创建也非常简单:圆括号内,字符之间以逗号区分.

    tuple1= 1,2,3     #元组的语法也非常简单,产生元组只需将字符逗号区分
    print(tuple1)
    tuple2= ( )       #元产生空元组只需使用空圆扩号表示即可,即便里面有空格也可
    print(tuple2)
    tuple3= (4,)       #元产生1个位置的元组,必须用逗号
    print(tuple3)
    tuple4= 3*(42)     #返回126
    print(tuple4)
    tuple5= 3*( 42,)       #元组与列表类似,返回一个重复3次42,的元组
    print(tuple5)
    tuple6= tuple([1,2,3])       #元组换型,如果目标是列表,就按列表各个元素建立元组
    print(tuple6)
    print(type(tuple6[1]))
    tuple7= tuple("123")       #元组换行,如果目标是字符串,就按各个字符建立元组
    print(tuple7)
    print(type(tuple7[1]))
    tuple8= tuple((1 , 2 , 3) )      #元组换型 ,如果目标是元组,就原封不动变动它
    print(tuple8)
    print(type(tuple8[1]))          #以上2个表明,列表中字符的格式,最终会遗传到元组中.

    效果如下:

    (1, 2, 3)
    ()
    (4,)
    126
    (42, 42, 42)
    (1, 2, 3)
    <class 'int'>
    ('1', '2', '3')
    <class 'str'>
    (1, 2, 3)
    <class 'int'>
    
    
  • 相关阅读:
    设计模式(二十)---迭代器模式
    设计模式(十九)---观察者模式
    设计模式(十八)---模板方法模式
    设计模式(十七)---策略模式
    ElasticSearch 安装
    MongoDB进击 Linux单机安装
    List集合去除重复对象。。。记录一下
    Springboot整合mybatisPlus实现分页
    git记录
    Springboot异常处理errorController
  • 原文地址:https://www.cnblogs.com/rango0550/p/10151911.html
Copyright © 2020-2023  润新知