数据结构 · 10 道样题

Python 列表练习题与答案

列表是大多数初学者每天都会用到的第一个数据结构。这一页检查你是否能读懂索引、原地修改列表,并在需要时选对方法。

82 道题在完整题库中 · 21 道选择 · 11 道填空 · 50 道输出

这个主题考什么

  • 不靠猜,正确读写索引和切片。
  • 分清会修改原列表的方法和返回新列表的方法。
  • 知道什么时候用循环,什么时候用内置函数。

常见错误

  • 用 = 复制列表,两个变量其实指向同一个列表。
  • 一边遍历一边删除元素,应该遍历副本。
  • 以为 .sort() 会返回排序后的列表;它返回 None。
样题

样题

10

从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。

  1. 选择题q0434

    1. 小明从奶茶订单列表 orders = ["张三", "李四", "王五"] 取最后一单,orders[-1] 是?

    1. 张三
    2. 王五
    3. -1
    4. 报错
    显示答案

    答案

    B. 王五

    解析: 负索引从末尾往前数,-1 是最后一个元素,-2 是它前面那个。返回的是 Carol 而不是数字 -1,只有越界才报 IndexError。

  2. 选择题q0446

    2. 下列哪个值不能作为字典的键?

    1. 1
    2. (1, 2)
    3. [1, 2]
    4. "a"
    显示答案

    答案

    C. [1, 2]

    解析: 键必须可哈希,列表可变、哈希会变,所以不能当键;元组、字符串、整数都可以。用列表做键会抛 TypeError。

  3. 选择题q0452

    3. 🧋 小明往订单列表加新单,append 和 extend 的区别?

    1. 没有区别
    2. append加一个元素,extend加多个元素
    3. extend加一个元素,append加多个
    4. append更快
    显示答案

    答案

    B. append加一个元素,extend加多个元素

    解析: append 接收单个对象,追加列表会形成嵌套;extend 遍历参数并逐个加入。看长度增长多少就能判断用了哪个。

  4. 选择题q0470

    4. 执行 b = a 后,a 和 b 是什么关系?

    1. 复制列表
    2. 指向同一对象
    3. 创建元组
    4. 深拷贝
    显示答案

    答案

    B. 指向同一对象

    解析: 赋值只是给同一个对象再绑一个名字,从不复制。需要两个独立列表时用 copy() 或切片,否则改一个另一个也变。

  5. 填空题q0436

    5. 小明给重复下单的顾客去重:`list(set(['milk','tea','milk']))` 去重后有 ___ 个元素(填数字)

    显示答案

    答案

    2

    解析: set 对每个不同字符串只留一份,milk 和 tea 保留,长度为 2。顺序不保证,别拿它当排序结果用,先去重再排序才稳定。

  6. 填空题q0453

    6. 🧋 小明往订单列表加新单,在列表末尾添加元素用 ___ 方法

    显示答案

    答案

    append

    解析: append 是只收一个参数、在末尾增长列表的方法。insert 要下标,extend 要可迭代对象,记不住时先想参数个数。

  7. 填空题q0474

    7. 复制列表的常用方法名是什么?

    显示答案

    答案

    copy

    解析: list.copy() 返回浅拷贝,是可读版的 a[:]。嵌套结构要改用 copy.deepcopy,否则内层仍然共享,复制方式决定改动传播的范围。

  8. 输出预测q0435

    8. 这个切片打印什么?

    orders = ["Alice", "Bob", "Carol"]
    print(orders[1:])
    显示答案

    答案

    ['Bob', 'Carol']

    解析: 从下标 1 切到末尾,保留 Bob 和 Carol,丢掉第一个元素。起始下标包含在内,省略终止表示一直到结束。

  9. 输出预测q0475

    9. `annotate([])` 返回什么?

    def annotate(garden):
        if not garden:
            return []
        verify_board(garden)
        row_len = len(garden[0])
        col_len = len(garden)
        board = [list(row) for row in garden]
    
        for index1 in range(col_len):
            for index2 in range(row_len):
                if board[index1][index2] != ' ':
                    continue
    
                low = max(index2 - 1, 0)
                high = min(index2 + 2, row_len + 2)
                counts = garden[index1][low:high].count('*')
    
                if index1 > 0:
                    counts += garden[index1 - 1][low:high].count('*')
                if index1 < col_len - 1:
                    counts += garden[index1 + 1][low:high].count('*')
                if counts == 0:
                    continue
    
                board[index1][index2] = str(counts)
        return [''.join(row) for row in board]
    
    
    def verify_board(garden):
        # Rows with different lengths
        row_len = len(garden[0])
        if not all(len(row) == row_len for row in garden):
            raise ValueError('The board is invalid with current input.')
    
        # Unknown character in board
        character_set = set()
        for row in garden:
            character_set.update(row)
        if character_set - set(' *'):
            raise ValueError('The board is invalid with current input.')
    
    print(annotate([]))
    显示答案

    答案

    []

    解析: 守卫在 verify_board 之前就返回 [],空花园根本进不了计数循环。没有格子可标注,结果自然是空列表。

  10. 输出预测q0492

    10. `spiral_matrix(5)` 返回什么?

    def spiral_matrix(size):
        matrix = [[0]*size for row in range(size)]
        idx = 0
        jdx = -1
        element = 1
    
        digital = [0, 1, 0, -1]
        disco = [1, 0, -1, 0]
    
        for edx in range(2*size - 1):
            for _ in range((2*size - edx) // 2):
                idx += digital[edx % 4]
                jdx += disco[edx % 4]
                matrix[idx][jdx] = element
                element += 1
        return matrix
    
    print(spiral_matrix(5))
    显示答案

    答案

    [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

    解析: 5×5 螺旋是 16 格的外圈(1 到 16)包住 3×3 螺旋(17 到 25),因此中心格最终是 25。

常见问题

完整题库里有多少道列表题?

完整题库中与列表课程对应的题目超过 80 道,包含选择题、填空题和输出预测题。

什么时候用列表,什么时候用元组?

集合需要变化时用列表;形状和顺序固定,或需要可哈希的键时用元组。

继续保持练习节奏。

完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。

打开完整练习