<Python> python从入门到实践(2) --组合数据类型

组合数据类型

序列

序列是具有先后关系的一组元素,具有以下特点:

  1. 是一个一维向量,
  2. 元素类型可以不同
  3. 元素间由序号引导,通过下标可以访问特定元素,且具有正向递增(从头从0)下标和反向递减(从尾从-1)。
  4. 序列是一个基类类型,在其上由继承出字符串、元组、列表。
  • 序列类型通用操作符:
操作符及应用 描述
x in s 如果x是序列的元素,返回True,否则返回False
x not in s 如果x是序列的元素,返回False,否则返回True
s + t 连接两个序列s和t
s*n 或 n*s 将序列s复制n次
s[i] 索引,返回s中第i个元素,i是序列的序号
s[i:j]或s[i:j:k] 切片,返回序列s中i到j以k为步长的元素子序列
  • 序列类型通用函数和方法
函数或方法 描述
len(s) 返回序列s的长度,即元素个数
min(s) 返回序列s的最小元素,s中元素需要可比较
max(s) 返回序列s的最大元素,s中元素需要可比较
s.index(x)或s.index(x,i,j) 返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x) 返回序列s中出现x的总次数

之前提过,元组、列表、字符串都是序列,所以上述操作都是通用的

列表简介

列表是什么

列表是一系列按特定顺序 排列的元素组成,其中的元素可以没有任何关系

# 用方括号创建列表
table = ['num1', 'num2', 'num3']
# 用list()创建,list可以将其他复杂类型转换为列表
table = list('num1', 'num2', 'num3')
# 打印列表
print(table)
# 将会得到输出
# ['num1', 'num2', 'num3']
  1. 访问列表元素

    print(table[0]) 将会输出 ‘num1’

    以上例子也能显示,索引是从0开始的,再次强调,索引-1表示最后一个元素,-2表示倒数第二个,以此类推

  2. 修改、增删元素

    • 修改时通过特定索引访问,然后修改即可
    • 添加时,使用作用于列表的方法append(元素)的方式在尾部增加元素
    • 插入时,使用作用于列表的方法insert(索引,元素)的方式在指定位置处增加元素(其余元素后移)
    • 删除时,使用del语句删除元素,或使用作用于列表的方法pop()方法来删除并获取尾部的元素,也可以用作用于列表的方法pop(索引)方法来删除并获取指定索引的元素
    • 根据值删除元素,可以使用作用于列表的方法remove(值)的方式删除所有值为给定的元素
    # 综合应用
    # 创建列表
    names = ['Gao Yuhe', 'Gao min', 'Er gou']
    # 遍历并输出
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    print(names[-1].title() + " could not come, Let's invite sjm")
    # 删除元素
    del names[-1]
    # 尾部增加元素
    names.append("sjm")
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    print("Let's invite some others")
    # 指定位置插入元素
    names.insert(0, "zhao siqi")
    names.insert(0, "yu yihuan")
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    print("Something's wrong, we can only invite two guests")
    # 弹出元素
    while len(names) > 2:
        print(names.pop() + ", sorry ,there won't be your seat")
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    # 字符串化
    print("Finally, there are "+str(len(names))+" come to the dinner.")
    # 排序与反转
    names.sort()
    for name in names:
        print("\tThey are " + name.title())
    names.sort(reverse=True)
    for name in names:
        print("\tThey are " + name.title())
    names.reverse()
    for name in names:
        print("\tThey are " + name.title())
    del names[0]
    del names[0]
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    
  3. 组织列表

    • 使用作用于列表的方法sort() 实现对列表自动排序(如字符串的字母序、数从小到大),值得注意的是,这个排序将会永久改变列表内元素的顺序
    • 使用方法sort(reverse=True) 将会按与自动排序相反的顺序排序
    • 使用函数sorted(列表)实现对列表的临时排序,同样可以加上参数reverse=True 实现与自动排序相反的排序
    • 更多的排序函数将会在后续补充
    • 反转列表,可以使用方法reverse() ,将列表反转
    • 可以使用函数 函数len(列表) 获取列表的长度
  4. 避免索引错误:记住从0开始有元素,另外-1表示最后一个

操作列表(遍历循环)

  1. 遍历列表

    for <变量名> in <列表变量名> 实现全部遍历,类似于foreach

    # 例子
    for name in names:
        print(name.title()+", would you like to have dinner with me?")
    
  2. 避免缩进错误:

    • 错误1: 循环体忘记缩进
    • 错误2: 循环体较长时只缩进了一部分
    • 错误3: 不必要的缩进,比如顺序结构下的缩进、缩进了循环体结束后的语句
    • 错误4:忘记冒号, 与C_like语言不同,python在if与循环判断语句时不惯用()而是使用:
  3. 创建数值列表

    • 函数range(起,止) 可以生成一系列数字

      for value in range(1,5)
      	print(value)
      # 输出
      # 1 
      # 2 
      # 3 
      # 4 
      

      注意左闭右开

    • 使用range()创建数字列表,如果将range()作为函数list()的参数,将会产生一个数字列表

      numbers = list(range(1,6))
      print(numbers)
      # output: 
      # [1,2,3,4,5]
      

      numbers成为一个列表

    • 为range函数指定步长: 使用函数range(起,止,步长)

      even_numbers = list( range(2,11,2))
      print (even_numbers)
      # output:
      # [2,4,6,8,10]
      

      同样为左闭右开区间

    • 自定义数字列表

      squares = []
      for value in range(1,11):
          square=value**2
          squares.append(square)
      
      print(squares)
      

      这里的 for value in range(1,11) 就相当于其它语言的 for(int i=1;i<11;i++)

  4. 对数字列表执行简单的统计计算

    • 函数min(列表变量) :获取数字列表中最小值

    • 函数max(列表变量) :获取数字列表中最大

    • 函数sum(列表变量) :获取数字列表所有值的总和

  5. 列表解析:

    将for循环和创建新元素的代码合并成一行,并自动附加新元素

    squares = [value ** 2 for value in range(1,11)]
    # output:
    # [1,4,9,16,25,36,49,64,81,100]
    
  6. 使用列表的一部分(切片)

    • 切片:<列表变量>[起始索引:终止索引]

      players = ['A','B','C','D']
      print(players[0:2])
      # output:
      # ['A','B']
      

      同样是左闭右开,如果缺少起始索引,将会从0开始,缺少终止索引,将会一直到最后,[::-1]的切片是整个原序列的逆序

    • 遍历切片

      for player in players[0:2]
      	print(player)
      
    • 复制列表

      1. 要复制列表,可以创建一个包含整个列表的切片,方式是同时省略起始索引和终止索引(也就是创建一个从0到-1的切片),随后将这个切片赋值给新列表即可
      2. 如果直接进行列表间的赋值,就类似于C语言的指针赋值一样,操作其中一个列表,另一个也会变化,事实上没有得到两个列表
  7. 元组

    列表内元素是可修改的,适合用于存储运行期间可能变化的数据集,而有时需要不可修改的元素,存放一系列不可修改元素的被称为元组

    • 定义元组和基本用法:

      # 用小括号定义元组
      dimensions = (200,50)
      #用tuple()定义元组,tuple()可以将其他复杂元素变为元组,
      #有利于利用元组的不可修改元素的特性保护数据
      dimensions = tuple(200, 50)
      # 输出元素,将会输出200
      print(dimensions[0])
      # 尝试修改元素,会报错
      dimensions[0]=999 # 报错
      # 遍历元组
      for dimension in demensions:
          print(dimension)
      
    • 虽然无法修改元组内的元素,但是可以修改元组变量

      dimensions = (200,50)
      for dimension in demensions:
          print(dimension)
      dimensions = (999,99) # 允许
      for dimension in demensions:
          print(dimension)
      

字典

  • 字典是对“映射”的一种建模,而映射是索引(键)和数据(值)的对应,像之前列表中的下标和值也是一种映射,字典的映射建立更加自由灵活

示例:

# 简略的初始化,适合较短的字典
alien={'color':'green','points':5}
# 复杂的初始化,适合较长的字典,注意缩进
pals={
    'Alan':'Helen'
    'Bob':'Cindy'
    'Cindy':'Bob'
    'Helen':'Alan'
	}

print(alien['color'])
print(alien['points'])
  1. 基础:

    • 字典是一系列键-值对,与键相关的值可以是数字、字符串、列表、甚至字典
    • 访问字典中的值 <字典名>[键]
    • 添加或修改键-值对:字典是一种动态结构,可以随时添加键-值对,要添加键-值对,可依次使用 <字典名>[<键名>]=值
    • 删除键-值对:del <字典名>[键]
    • <字典名>.keys()返回字典d中所有的键信息
    • <字典名>.values()返回字典d中所有的值信息
    • <字典名>.items()返回字典d中所有的键值对信息,返回的是特殊的dict_values类型,便于直接使用for-in结构
  2. 遍历字典

    #使用items()方法遍历整个字典的键值对
    friends = {'first' : 'Gao Yue'
              'Second' : 'Yu Yihuan'
              'Third' : 'Zhao Dadiao'
              }
    for key, value in friends:
        print(key + ': ' + value + '.')
    #key & value分别用于遍历键和值,这两个变量名字任意
    
    #分别使用字典的keys()和values()方法来遍历所有键,由于使用一个变量遍历字典默认遍历键名,所以事实上.keys()方法大部分情况下可以省略
    friends = {'first' : 'Gao Yue'
              'Second' : 'Yu Yihuan'
              'Third' : 'Zhao Dadiao'
              }
    for key in friends.keys():
        print(key + '.')
    for value in friends.values():
        print(value + '.')
        
    #通常遍历字典的顺序时随机的,为了使按某种顺序遍历,可以对字典使用sorted()函数,不含参数时,字典序遍历
    friends = {'first' : 'Gao Yue'
              'Second' : 'Yu Yihuan'
              'Third' : 'Zhao Dadiao'
              }
    for key in sorted(friends.keys()):
        print(key + '.')
        
    #利用set()将字典、列表转换为set实现去重
    friends = {'first' : 'Gao Yue'
              'Second' : 'Yu Yihuan'
              'Third' : 'Zhao Dadiao'
              }
    for key in set(friends.keys()):
        print(key + '.')
    
  3. 字典允许嵌套,可以创建字典列表,列表字典,字典字典

    # 字典嵌套字典示例
    users = {
        'Alan': {
            'first': 'Alan'
            'last': 'Adoil'
        	'location': 'Atlantic'
        	}
        'Brown': {
            'first': 'Brown'
            'last': 'Black'
        	'location': 'Beijing'
        	}
    }
    
函数或方法 描述
d.get(k,<default> ) 键k存在,则返回相应值,不在则返回<default>值
d.pop(k, <default>) 键k存在,则取出相应值,不在则返回<default>值
d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
d.clear() 删除所有的键值对
len(d) 返回字典d中元素的个数
posted @ 2020-08-07 17:49  Faura_Sol  阅读(137)  评论(0)    收藏  举报
Live2D