美文网首页
Python 内置数据结构之二(元组)

Python 内置数据结构之二(元组)

作者: Alexander_Zz | 来源:发表于2019-08-14 15:29 被阅读0次

    一、元组 tuple

    1.1 一个有序的元素组成的集合
    1.2 使用小括号 () 表示
    • 示例
    t1 = tuple()
    t2 = ()
    t3 = (1,)   # 不可写成 t3 = (1) 
    t4 = (1,'a',range(1))
    
    1.3 元组是 不可变 对象
    • 示例
    t5 = (1,[2,3],(4,5))
    t5[1] = 3
    t5[1][0] = 3
    t5[2][0] = 3
    
    不可变示例 1 .png
    不可变示例 2 .png

    二、元组的定义 初始化

    2.1 定义
    • tuple() -> empty tuple
    • tuple(iterable) -> tuple initialized from iterable's items
    • 示例
    t = tuple()   # 工厂方法
    t = ()
    t = tuple(range(1,7,2))   # iterable 可迭代对象
    t = (2,4,6,3,4,2,)
    t = (1,)   # 一个元素元组的定义,注意有个逗号
    t = (1,)*5
    t = (1,2,3) * 5
    
    示例.png

    三、元组元素的访问

    3.1 支持索引(下标)
    • 正索引
      a) 从左至右,从 0 开始,为列表中每个元素编号
      b) 示例
    t1 = (range(5))
    t1[2]
    
    示例.png
    • 负索引
      a) 从右至左,从 -1 开始
      b) 示例
    t1 = (range(5))
    t1[-1]
    
    示例.png
    • 正负索引不可超界,否则引发异常 IndexError


      IndexError.png

    四、元组查询

    4.1 index(value,[start,[stop]])
    • 通过值 value ,从指定区间查找元组内的元素是否匹配
    • 匹配第一个就立即返回索引
    • 匹配不到,抛出异常 ValueError
    4.2 count(value)
    • 返回元组中匹配 value 的次数
    4.3 时间复杂度
    • index 和 count 方法都是 O(n)
    • 随着元组数据规模的增大,而效率下降
    4.4 len(tuple)
    • 返回元素个数

    五、元组的其他操作

    5.1 元组是只读的,所以 增、删、改 方法都没有

    六、命名元组 namedtuple

    6.1 namedtuple(typename,field_names,verbose=False,rename=False)
    • 命名元组,返回一个元组的子类,并定义了字段
    • field_names 可以是空白符或都好分割的字符串,可以是字段的列表
    6.2 示例
    from collections import namedtuple
    
    Student = namedtuple('Student','name age')   # Student 为返回的类,括号中的 Student 为显示名称
    tom = Student('tom',20)
    jerry = Student('jerry',21)
    
    示例.png

    七、冒泡法

    7.1 冒泡法
    • 属于交换排序
    • 两两比较大小,交换位置。如同水泡咕嘟咕嘟网上冒
    • 结果分为升序和降序排列
    7.2 升序
    • n 个数从左至右,编号从 0 开始到 n-1,索引 0 和 1 的值比较,如果索引 0 大,则交换两者位置,如果索引 1 大,则不交换。继续比较索引 1 和 2 的值,将大值放在右侧。直至 n-2 和 n-1 比较完,第一轮比较完成。第二轮从索引 0 比较到 n-2,因为最右侧 n-1 位置上已经是最大值了。依次类推,没一轮都会减少最右侧的不参与比较,直至剩下最后 2 个数比较
    7.3 降序
    • 和升序相反
    冒泡法图示.png
    7.4 示例
    nums = [1,9,8,5,6,7,4,3,2]
    length = len(nums)
    
    for i in range(length -1):
        for j in range(length -1 -i):
            if nums[j] > nums[j+1]:
                temp = nums[j]
                nums[j] = nums[j+1]
                nums[j+1] = temp
    
    print (nums)
    
    基础.png 优化.png
    7.5 冒泡法总结
    • 冒泡法需要数据一轮轮比较
    • 可以设定一个标记判断此轮是否有数据交换发生,若无交换发生,则可结束排序,反之进行下一轮排序
    • 最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数 1,2,...,n-1 之和 n(n-1)/2
    • 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数 n-1
    • 时间复杂度 O(n^2)

    八、练习

    8.1 依次接收用户输入的 3 个数,排序后打印
    • 转换 int 后,判断大小排序,使用分支结构完成
    • 使用 max 函数
    • 使用列表的 sort 方法
    # 练习一
    nums = []
    
    for i in range(3):
        nums.append(int(input('No {} >>>'.format(i))))   # input('>>>')
        
    targets = []
    
    if nums[0] > nums[1]:
        if nums[1] > nums[2]:
            pass
        else:                                            # nums[2] >= nums[1]
            if nums[0] > nums[2]:
                nums = [nums[0],nums[2],nums[1]]
    #             targets = [0,2,1]                      # 记录索引方式,两种方式任选其一
            else:                                        # nums[2] >= nums[0]
                nums = [nums[2],nums[0],nums[1]]               
    else:                                                # nums[1] >= nums[0]
        if nums[0] > nums[2]:
            nums = [nums[1],nums[0],nums[2]]
        else:                                            # nums[2] >= nums[0]
            if nums[1] > nums[2]:
                nums = [nums[1],nums[2],nums[3]]
            else:                                        # nums[2] >= nums[1]
                nums = [nums[2],nums[1],nums[0]] 
    print (nums)
    
    # for index in targets:                              # 索引记录方式打印
    #     print (nums[index])
    
    练习一.png
    # 练习二
    # 不推荐实际生产中使用此方法,效率低下
    nums = []
    
    for i in range(3):
        nums.append(int(input('No {} >>>'.format(i))))
        
    targets = []
    
    # while nums:                       # 不推荐使用 for 循环,for j in range(len(nums)):
    #     targets.append(max(nums))
    #     nums.remove(max(nums))
    # print (targets)
    
    while True:
        val = max(nums)
        print (val)
        nums.remove(val)
        if len(nums) == 1:
            print (nums[0])
            break
    
    练习二.png
    # 练习三
    nums = []
    
    for i in range(3):
        nums.append(int(input('No {} >>>'.format(i))))
    
    nums.sort()   # 如需倒序,nums.sort(reverse=True)
    print (nums)
    
    练习三.png

    相关文章

      网友评论

          本文标题:Python 内置数据结构之二(元组)

          本文链接:https://www.haomeiwen.com/subject/kjcmdctx.html