Python列表操作

内容简介:

  • 了解列表的基本概念
  • 掌握列表的常用操作
  • 理解列表的常见算法原理与代码实现
  • 了解多维列表的操作及使用场景

列表

  • 认识列表

    • 列表是Python中的一种可变数据类型
    • 列表可以存储任意大小的数据集合
    • 列表是一个用list类定义的序列,包括了创建、操作和处理列表的方法
  • 列表的使用

    • 列表中的数据元素可以通过下标来访问

    • 列表中既可以包含同类型元素,也可以包含不同类型元素:

      list1 = [1, “大乔”, 2, “小乔”, 3, “寸金莲”, 4, “寸腰”]

      list2 = [“pi”, 3.1415, “e”, 2.7182]

    • 提示: Python中的列表一般不用考虑最大容量

      32位python的限制是 536870912 个元素。
      64位python的限制是 1152921504606846975 个元素

  • 创建列表

    my_list1 = list()               			# 实例化一个列表对象/创建一个空的列表对象
    my_list2 = list("金木水火土")    			# 创建一个带有5个字符元素的列表,元素个数就是字符串中的字符个数
    my_list3 = list([9, 5, 2, 7])   			# 创建一个带有4个整数元素的列表
    my_list4 = list(range(10))      			# 通过一个可迭代对象创建对应元素的列表
    my_list5 = []                   			# 创建一个空列表
    my_list6 = ["金木水火土"]        			# 创建一个元素的列表
    my_list7 = ["金", "木", "水", "火", "土"]    # 创建五个元素的列表
    # 推导式
    """
    my_list_iterator = []
    for i in range(10):
        my_list_iterator.append(i)  			# 向列表中追加元素
    """
    my_list_iterator1 = [element for element in range(10)]       # 向列表中追加元素
    my_list_iterator2 = [10 for element in range(10)]            # 使用推导式创建带有10个10的元素列表
    my_list_iterator3 = [str(i) for i in range(10)]              # 使用推导式创建字符元素列表
    

元组和列表的区别

  • 元组和列表都属于序列

  • 列表属于可变序列,它的元素可以随时修改或者删除,而元组属于不可变序 列,其中的元素是不能修改的,除非整体重新赋值

  • 列表可以使用多种方法实现添加和修改列表元素,而元组没有办法,因为不能想元组中添加或修改元素,同样也不能删除元素

  • 列表可以使用切片方法访问和修改列表中的元素,元组也支持切片,但是它只支持通过切片访问元组中的元素,不支持修改

  • 元组比列表中的访问和处理速度更快,所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组

  • 列表不能作为字典类型中的键,而元组是可以的

序列的常用操作

  • Python中的字符串和列表都是序列类型

  • 列表是任何元素的序列,字符串是一个字符序列
    Python列表操作_第1张图片

    # @function: 列表的基本概念
    # @Description:
    
    # 列表是一个用list类定义的序列,包括了创建、操作和处理列表的方法
    my_list1 = list()               # 实例化一个列表对象/创建一个空的列表对象
    my_list2 = list("金木水火土")    # 创建一个带有5个字符元素的列表,元素个数就是字符串中的字符个数
    my_list3 = list([9, 5, 2, 7])   # 创建一个带有4个整数元素的列表
    my_list4 = list(range(10))      # 通过一个可迭代对象创建对应元素的列表
    my_list5 = []                   # 创建一个空列表
    my_list6 = ["金木水火土"]        # 创建一个元素的列表
    my_list7 = ["金", "木", "水", "火", "土"]    # 创建五个元素的列表
    # 推导式
    """
    my_list_iterator = []
    for i in range(10):
        my_list_iterator.append(i)  # 向列表中追加元素
    """
    my_list_iterator1 = [element for element in range(10)]       # 向列表中追加元素
    my_list_iterator2 = [10 for element in range(10)]            # 使用推导式创建带有10个10的元素列表
    my_list_iterator3 = [str(i) for i in range(10)]              # 使用推导式创建字符元素列表
    
    
    # 列表的常用操作
    # 1. in / not
    list1 = [num for num in range(101) if num % 2 == 0]
    list2 = [num for num in range(0, 101, 2)]
    print(55 in list1, 55 not in list2)
    # 2. 列表的加法和乘法
    print(list1 + list2)        # 列表的相加实际上就是返回连接的两个列表
    list3 = [var for var in range(5)]
    print(list3 * 10)           # 列表乘以整数时,返回n个列表的连接
    # 3.取出列表中的元素或某个区间的元素(列表的切片)
    list3 *= 10
    print(list3[45])            # 取某个下标的元素,要求下标处于正确的范围内
    list4 = [num for num in range(101) if num % 2 == 1]
    print("取[20-36]之间的列表片段:", list4[24:36])
    # 进阶:下标实际上可以为负数
    # 原理: list4[-1] = list4[len(list4) - 1]     # 列表总长度减去下标
    print(list4[-1])            # 实际上返回的是倒数第一个元素
    print(list4[25: -1])        # 取列表切片时,若范围是start>= end,则返回空列表
    print(list4[25: 99])        # 如果end大于列表的最大下标,那么默认是列表的最大下标
    # 4. 列表的求和、最大值和最小值
    list5 = [x for x in range(101)]
    print("1-100之和为:", sum(list5))
    import random
    random.shuffle(list5)
    print("乱序后的列表:", list5)
    print("最大值:", max(list5), "\t最小值:", min(list5))
    print("平均值:", sum(list5) / len(list5))
    
    # 列表的比较
    list6 = [x for x in range(10)]
    list7 = [x for x in range(0, 10)]
    # 比较逻辑: 首先比较前两个元素,如果不同则确定比较结果;如果相同,继续比较后面的两个元素,重复这个操作
    print("list6:", list6, "\n", "list7:", list7)
    print(list6 == list7)
    print(list6 > list7)
    print(list6 < list7)
    

列表的方法

  • 列表被创建还可以使用list类的方法简化操作
    Python列表操作_第2张图片

书写Python程序模拟洗牌的过程(52张牌)

  • 扑克牌程序说明
    Python列表操作_第3张图片

    # @function:书写Python程序模拟洗牌的过程(52张牌)
    # @Description:
    import random       # 引入随机方法
    
    # 生成52个元素,表示一副牌
    cards = [card for card in range(52)]
    types = ["黑桃", "红心", "方块", "梅花"]                 # 花色
    values = ["ACE"]                                        # 牌面
    values += [str(value) for value in range(2, 11)]        # 字符串只能和字符串拼接
    values += ["JACK", "QUEEN", "KING"]
    
    # print(cards[24])
    # print("元素24对应的花色", types[cards[24] // 13])         # 得到对应花色的下标
    # print("元素24对应的牌面", values[cards[24] % 13])         # 得到对应牌面的下标
    
    random.shuffle(cards)                                      # 洗牌
    for i in range(len(cards)):
        card_type = types[cards[i] // 13]
        card_value = values[cards[i] % 13]
        print("[{:2}]:{}-{:6}".format(cards[i], card_type, card_value), end="")
        if (i + 1) % 13 == 0:
            print()
    

线性查找法

demon

list_names = ["刘备", "关羽", "张飞", "孙权", "黄盖", "鲁肃", "曹操", "曹丕", "曹植"]
search_name = input("请输入要查找的英雄名称:")
index = -1
for i in range(len(list_names)):
    if search_name == list_names[i]:
        index = i
        break
if index == -1:
    print("没有找到英雄", search_name, ",请检查输入后重试!")
else:
    print("{}的下标为:{}".format(search_name, index))

二分查找法

Python列表操作_第4张图片
更新操作
Python列表操作_第5张图片Python列表操作_第6张图片

# @function:二分查找法
# @Description: 一只萤火虫

import random
lst = []
# 使用循环生成一个不重复的列表
for i in range(20):
    rand_num = random.randint(1, 101)
    while rand_num in lst:
        rand_num = random.randint(1, 101)
    lst.append(rand_num)
print("生成的随机列表:", lst)
lst.sort()
print("排序后的列表:", lst)
# 二分查找法
search_num = int(input("请输入要查找的数字:"))
search_index = -1
low = 0                         # 最小边界的下标
high = len(lst) - 1             # 最大边界的下标
while high >= low:
    mid = (low + high) // 2
    if search_num == lst[mid]:
        search_index = mid
        break
    elif search_num < lst[mid]:
        high = mid - 1
    else:
        low = mid + 1
if search_index == -1:
    print("查找失败,列表中中没有这个元素!")
else:
    print("查找元素的下标是:", search_index)

冒泡排序

# @function:冒泡排序、
# @Description:一只萤火虫

# 冒泡排序
import random
lst = [random.randint(1, 100) for i in range(5)]
print("排序前:", lst)
for i in range(len(lst) - 1):
    flag = True
    for j in range(len(lst) - i - 1):
        if lst[j] > lst[j + 1]:
            lst[j], lst[j + 1] = lst[j + 1], lst[j]
            flag = False
    if flag:                    # 如果在内循环中,一次都没有交换,实际上列表已经有序了
        break
print("排序后:", lst)

选择排序

  • 算法原理
    假设对列表升序排列:
    1.首先找到列表中的最小元素并将它和第一个元素交换
    2.找到剩余元素中值最小的元素并和剩余列表的第一个元素交换
    3.一次类推,直到只剩一个元素
    Python列表操作_第7张图片Python列表操作_第8张图片

    # @function: 选择排序
    # @Description:一只萤火虫
    
    # 选择排序
    import random
    lst = [random.randint(1, 100) for i in range(5)]
    print("排序前:", lst)
    for i in range(len(lst) - 1):
        min_index = i
        for j in range(i + 1, len(lst)):        # 内循环中求出剩下元素的最小值下标
            if lst[j] < lst[min_index]:
                min_index = j                   # 如果某个元素比最小值还小,那么最小值下标就更新为j
        lst[i], lst[min_index] = lst[min_index], lst[i]
    print("选择排序后:", lst)
    

插入排序

  • 算法原理:
    将一个新元素重复插入到一个已排序的子列表中
    Python列表操作_第9张图片
    第一轮插入之后,再将18插入到[51, 18]构成的列表中
    Python列表操作_第10张图片Python列表操作_第11张图片

    # @function:插入排序
    # @Description:一只萤火虫
    import time
    import random
    
    lst = [random.randint(1, 100) for i in range(5000)]
    start = time.time()
    print("插入排序前:", lst)
    for i in range(1, len(lst)):
        curr_element = lst[i]               # 记录下待插元素
        j = i - 1                           # 需要从子列表的第一个元素开始循环
        while j >= 0 and lst[j] > curr_element:     # 找到子列表中比待插入元素还小的位置
            lst[j + 1] = lst[j]
            j -= 1                          # 内循环条件更新
        lst[j + 1] = curr_element       # 在插入位置之前保存的待查元素
    print("插入排序后:", lst)
    print("选择排序耗时:{}".format(time.time() - start))
    

二维列表

  • 二维列表是将其他列表作为元素的列表

    score1 = [89, 87, 76]
    score2 = [76, 86, 78]
    score3 = [89, 90, 92]
    scores = [score1, score2, score3]

  • 操作二维列表

    # @function:二维列表
    # @Description:一只萤火虫
    scores = []                         # 创建一个空列表
    names = ["刘备", "关羽", "张飞"]
    courses = ["语文", "数学", "英语"]
    for row in range(len(names)):
        scores.append([])               # 添加一个列表类型的元素
        for col in range(len(courses)):
            score = eval(input("请输入{}的{}成绩:".format(names[row], courses[col])))
            scores[row].append(score)
    print("{:16}{:8}{:8}{:8}".format(" ", "语文", "数学", "英语"))
    for row in range(len(scores)):
        for col in range(len(scores[0])):
            print("{}的{}成绩为:{:.2f}".format(names[row], courses[col], scores[row][col]), end="\t")
        print()
    

运行结果:python3.8解释器
Python列表操作_第12张图片

你可能感兴趣的:(Python)