鱼C论坛

 找回密码
 立即注册
查看: 223|回复: 19

[快问快答] 第022讲:列表(IV)

[复制链接]
发表于 2025-10-24 06:37:35 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 5 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-11-18 11:58:43 | 显示全部楼层
@FishC 执行以下代码后,board 的值是?

row = [0, 0]
board = [row, row]
board[0][0] = 1

A. [[1, 0], [0, 0]]
B. [[1, 0], [1, 0]]
C. [[1, 1], [0, 0]]
D. [[0, 0], [0, 0]]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 11:59:33 | 显示全部楼层
qwerty2200 发表于 2025-11-18 11:58
@FishC 执行以下代码后,board 的值是?

row =
b ...


执行以下代码后,board 的值是 B. [[1, 0], [1, 0]]。

解释:
- row = [0, 0] 创建了一个列表对象。
- board = [row, row] 使得 board 的两个元素都引用同一个 row 列表。
- 执行 board[0][0] = 1 时,修改了共享列表的第一个元素,因此 row 变为 [1, 0],导致 board 的两个元素都显示为 [1, 0]。

所以,最终 board 是 [[1, 0], [1, 0]]。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 11:59:35 | 显示全部楼层
@FishC 下面哪种方式能正确地将二维列表的行和列互换(转置)?
A. [[row[i] for row in matrix] for i in range(len(matrix[0]))]
B. matrix[::-1]
C. matrix * -1
D. [matrix[i][j] for i in range(len(matrix)) for j in range(len(matrix[0]))]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:00:03 | 显示全部楼层
@FishC 执行以下代码后,a is b 的结果是?

a = [100, 200, 300]
b = [100, 200]
b = b + [300]

A. True
B. False
C. 报错
D. None
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:00:44 | 显示全部楼层
@FishC 执行以下代码后,sum_value 的值是?

data = [[1, 2], [3, 4]]
sum_value = sum(data[0] + data[1])

A. 3
B. 7
C. 10
D. 报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:01:38 | 显示全部楼层
qwerty2200 发表于 2025-11-18 11:59
@FishC 下面哪种方式能正确地将二维列表的行和列互换 ...


根据您的问题,下面我将分析每个选项,并解释为什么它们不能正确转置二维列表。最后,我会给出正确的转置方法。

  • A. [[row for row in matrix] for i in range(len(matrix[0]))]:这个表达式会为每一列复制整个原始矩阵,而不是转置行和列。例如,如果 matrix 是 [[1,2],[3,4]],结果会是 [[[1,2],[3,4]], [[1,2],[3,4]]],这不是转置。
  • B. matrix[::-1]:这个表达式只是反转行的顺序,而不是转置。例如,[[1,2],[3,4]] 会变成 [[3,4],[1,2]],而不是转置后的 [[1,3],[2,4]]。
  • C. matrix * -1:这个表达式在 Python 中对于列表没有定义,会引发错误,因为列表不支持与 -1 相乘。
  • D. [matrix[j] for i in range(len(matrix)) for j in range(len(matrix[0]))]:这个表达式会创建一个扁平列表,并可能引发索引错误。例如,如果 matrix 有 2 行 3 列,当 j=2 时可能超出行索引范围,而且结果不是二维转置结构。


因此,以上选项都不能正确转置二维列表。

正确的转置方法是使用以下列表推导式:

  1. transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
复制代码

或者使用 zip(*matrix) 结合 list(map(list, ...))

  1. transposed = list(map(list, zip(*matrix)))
复制代码

这两种方法都能高效地将行和列互换。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:01:43 | 显示全部楼层
qwerty2200 发表于 2025-11-18 12:00
@FishC 执行以下代码后,a is b 的结果是?

a =
...


答案:B. False

解释:
在 Python 中,is 操作符用于检查两个变量是否引用同一个对象(即内存地址是否相同)。

代码执行过程:
- a = [100, 200, 300] 创建了一个列表对象。
- b = [100, 200] 创建了另一个列表对象。
- b = b + [300] 执行列表连接操作,这会创建一个新的列表对象(内容为 [100, 200, 300]),并将 b 重新赋值为这个新对象。

因此,ab 指向不同的内存地址,a is b 返回 False

您可以通过以下代码验证:

  1. a = [100, 200, 300]
  2. b = [100, 200]
  3. b = b + [300]
  4. print(a is b)  # 输出 False
复制代码


所以,正确答案是 B. False。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:02:28 | 显示全部楼层
qwerty2200 发表于 2025-11-18 12:00
@FishC 执行以下代码后,sum_value 的值是?

data  ...


执行以上代码后,sum_value 的值为 10。

解释:
- data[0] 是 [1, 2],data[1] 是 [3, 4]
- data[0] + data[1] 进行列表拼接,结果为 [1, 2, 3, 4]
- sum([1, 2, 3, 4]) 计算所有元素的和,即 1 + 2 + 3 + 4 = 10

因此,正确答案是 C. 10。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-18 12:04:10 | 显示全部楼层
qwerty2200 发表于 2025-11-18 11:59
@FishC 下面哪种方式能正确地将二维列表的行和列互换 ...


经过分析,提供的选项中没有一个能正确地将二维列表的行和列互换(转置)。下面我会简要解释每个选项为什么错误,并给出正确的实现方式。

  • 选项 A: [[row for row in matrix] for i in range(len(matrix[0]))]
    这个表达式会创建一个新列表,其中包含原矩阵的多个副本(数量等于列数),而不是转置后的矩阵。
  • 选项 B: matrix[::-1]
    这个操作只是反转矩阵的行顺序,并不改变行和列的位置。
  • 选项 C: matrix * -1
    在 Python 中,列表不支持与 -1 相乘,这会导致 TypeError 或产生意外结果。
  • 选项 D: [matrix[j] for i in range(len(matrix)) for j in range(len(matrix[0]))]
    这个表达式会生成一个扁平化的列表,其中包含原矩阵行的重复元素,而不是转置后的二维结构。


正确的转置方法可以使用以下代码之一:

使用列表推导式:
  1. transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
复制代码


使用 zip 函数:
  1. transposed = list(map(list, zip(*matrix)))
复制代码


这两种方式都能确保行和列正确互换。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-27 14:08:44 | 显示全部楼层
@FishC 执行以下代码后,chess 的哪些位置会是 'Q'?

chess = [['.' for _ in range(3)] for _ in range(3)]
chess[1][1] = 'Q'

A. 只有[1][1]
B. 整个第二行
C. 整个第二列
D. 所有位置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-27 14:09:33 | 显示全部楼层
discipline_calm 发表于 2025-11-27 14:08
@FishC 执行以下代码后,chess 的哪些位置会是 'Q'?
...


执行给定代码后,chess 中只有位置 [1][1] 是 'Q'。

解释:
  • chess = [['.' for _ in range(3)] for _ in range(3)] 创建一个 3x3 的二维列表,所有元素初始化为 '.'。
  • chess[1][1] = 'Q' 将索引为 [1][1] 的位置(第二行第二列,索引从 0 开始)设置为 'Q'。


因此,其他位置保持不变,仍为 '.'。

正确答案是 A. 只有[1][1]。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-12-4 15:38:56 | 显示全部楼层
@FishC 下面哪个表达式的结果是 [[1], [1], [1]]?
A. [[1]] * 3
B. [[1] for _ in range(3)]
C. [1] * 3
D. [[1, 1, 1]]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-12-4 15:41:09 | 显示全部楼层
wyz20010429 发表于 2025-12-04 15:38
@FishC 下面哪个表达式的结果是 [, , ]?
A. [] * 3
...


正确答案是选项 B。下面详细解释每个选项:

  1. A. [[1]] * 3
复制代码

这个表达式的结果看起来是 [[1], [1], [1]],但实际上它创建了一个包含三个引用的列表,每个引用都指向同一个子列表 [1]。这意味着如果你修改其中一个子列表(例如 a[0][0] = 2),其他两个也会跟着改变。

  1. B. [[1] for _ in range(3)]
复制代码

这个表达式使用列表推导式,每次迭代都创建一个新的子列表 [1],因此结果确实是三个独立的子列表组成的列表 [[1], [1], [1]]。修改其中一个不会影响其他。

  1. C. [1] * 3
复制代码

这个表达式的结果是 [1, 1, 1],一个包含三个整数 1 的列表,不符合要求。

  1. D. [[1, 1, 1]]
复制代码

这个表达式的结果是 [[1, 1, 1]],一个包含单个子列表(该子列表有三个 1)的列表,也不符合要求。

因此,只有选项 B 能产生符合要求的、且子列表相互独立的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
@FishC 执行以下代码后,table[1][1] 的值是?

table = [[i*j for j in range(1, 4)] for i in range(1, 4)]

A. 1
B. 2
C. 4
D. 9
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
40岁学编程 发表于 2025-12-08 22:53
@FishC 执行以下代码后,table 的值是?

table =
...


给定的代码片段不完整,但根据常见模式,可能意图是创建一个 3x3 的乘法表:


  1. table = [[i*j for j in range(1,4)] for i in range(1,4)]
复制代码


生成的 table 如下:
  • table[0] 对应 i=1: [1, 2, 3]
  • table[1] 对应 i=2: [2, 4, 6]
  • table[2] 对应 i=3: [3, 6, 9]


注意 Python 索引从 0 开始,因此 table[1][1] 表示第二行第二列的元素,即 4。

所以正确答案是 C.4。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
@FishC 下面哪种方式能正确地将二维列表的行和列互换(转置)?
A. [[row[i] for row in matrix] for i in range(len(matrix[0]))]
B. matrix[::-1]
C. matrix * -1
D. [matrix[i][j] for i in range(len(matrix)) for j in range(len(matrix[0]))]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
40岁学编程 发表于 2025-12-08 23:03
@FishC 下面哪种方式能正确地将二维列表的行和列互换 ...

下面哪种方式能正确地将二维列表的行和列互换(转置)?


这些选项中没有一个能完全正确地实现二维列表的转置。下面分析每个选项:

A. [[row for row in matrix] for i in range(len(matrix[0]))]
这个选项不会转置矩阵。它实际上会创建一个列表,其中包含 len(matrix[0]) 个原始 matrix 的副本。例如:

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. result = [[row for row in matrix] for i in range(len(matrix[0]))]
  3. print(result)  # 输出:[[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]]
复制代码


B. matrix[::-1]
这只是将矩阵的行顺序反转,而不是转置。例如:

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. print(matrix[::-1])  # 输出:[[4, 5, 6], [1, 2, 3]]
复制代码


C. matrix * -1
在 Python 中,列表乘法不支持负数,这会导致得到一个空列表。例如:

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. print(matrix * -1)  # 输出:[]
复制代码


D. [matrix[j] for i in range(len(matrix)) for j in range(len(matrix[0]))]
这个选项存在索引错误。因为 j 的范围是列数,但 matrix[j] 需要 j 小于行数。当列数大于行数时,会引发 IndexError。例如:

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. # 尝试执行会报错:IndexError: list index out of range
复制代码


正确的转置方法:
要实现二维列表的转置,可以使用以下方法之一:

1. 使用嵌套列表推导式:

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
  3. print(transposed)  # 输出:[[1, 4], [2, 5], [3, 6]]
复制代码


2. 使用 zip(*matrix)

  1. matrix = [[1, 2, 3], [4, 5, 6]]
  2. transposed = list(map(list, zip(*matrix)))
  3. print(transposed)  # 输出:[[1, 4], [2, 5], [3, 6]]
复制代码


因此,如果你必须从选项中选择,那么选项 A 最接近,但需要修正为 [[row[i] for row in matrix] for i in range(len(matrix[0]))] 才能正确转置。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
@FishC 关于列表乘法 [1, [2, 3]] * 2 的结果,下面哪个说法正确?
A. 结果是 [1, [2, 3], 1, [2, 3]]
B. 结果中两个 [2, 3] 是同一个对象
C. 修改结果中第一个 [2, 3] 不会影响第二个
D. 会产生深拷贝
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
40岁学编程 发表于 2025-12-09 09:22
@FishC 关于列表乘法 [1, ] * 2 的结果,下面哪个说法 ...

关于列表乘法 [1, [2, 3]] * 2 的结果,下面哪个说法正确?
A. 结果是 [1, [2, 3], 1, [2, 3]]
B. 结果中两个 [2, 3] 是同一个对象
C. 修改结果中第一个 [2, 3] 不会影响第二个
D. 会产生深拷贝


在 Python 中,列表乘法(如 [1, [2, 3]] * 2)会创建一个新列表,其中包含原列表元素的重复。但需要注意的是,对于可变对象(如嵌套列表),乘法复制的是元素的引用,而不是深拷贝。因此:

选项 A:正确。乘法后的结果确实是 [1, [2, 3], 1, [2, 3]]

选项 B:正确。因为嵌套列表 [2, 3] 是可变对象,乘法复制了它的引用,所以结果中的两个 [2, 3] 是同一个对象。

选项 C:错误。由于两个 [2, 3] 是同一个对象,修改其中一个(例如添加元素)会直接影响另一个。

选项 D:错误。列表乘法执行的是浅拷贝,不会创建深拷贝。

验证代码:


  1. # 执行列表乘法
  2. original = [1, [2, 3]]
  3. result = original * 2

  4. # 查看结果
  5. print("结果:", result)  # 输出: [1, [2, 3], 1, [2, 3]]

  6. # 检查两个嵌套列表是否为同一对象
  7. print("result[1] is result[3]:", result[1] is result[3])  # 输出: True

  8. # 修改一个嵌套列表
  9. result[1].append(4)
  10. print("修改后:", result)  # 输出: [1, [2, 3, 4], 1, [2, 3, 4]]
复制代码


综上所述,正确的说法是 A 和 B。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-12 11:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表