鱼C论坛

 找回密码
 立即注册
查看: 64|回复: 3

[已解决]用for嵌套循环语句生成一个三维列表

[复制链接]
发表于 前天 23:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大神:

我尝试用for嵌套循环语句生成一个三维列表,我的代码如下:

A = [0] * 3
for i in range(3):
    A[i] = [0] * 3
    for j in range(i):
        A[i][j] = [0] * 3


但生成的结果却是:[[0, 0, 0], [[0, 0, 0], 0, 0], [[0, 0, 0], [0, 0, 0], 0]],而非[[[000],[000],[000]],[[000],[000],[000]],[[000],[000],[000]]],麻烦大神帮我看下我的代码哪里有问题,谢谢!
最佳答案
昨天 10:22
先看逻辑:

A = [0] * 3
生成 [0, 0, 0]。

第一层循环 for i in range(3):

每次把 A[i] 改为 [0]*3 → 得到一维列表 [0,0,0]

第二层循环 for j in range(i):

注意:range(i) 不会覆盖全部 j=0,1,2

它生成的是:

  • 当 i=0:range(0) → 不执行
  • 当 i=1:range(1) → 只执行 j=0
  • 当 i=2:range(2) → 执行 j=0,1

在这些位置把 A[i][j] 替换为 [0,0,0],但 只替换部分位置,不是整行。

结果自然会是一个“下三角区域变成三维列表,其余仍是整数 0”。

因此你的结果变成:

  1. [
  2. [0, 0, 0],
  3. [[0,0,0], 0, 0],
  4. [[0,0,0], [0,0,0], 0]
  5. ]
复制代码

代码并不是生成 3×3×3 结构,而是在不同位置替换部分值。


正确写法:生成 3×3×3 立方体

你想要的结果是:

  1. [
  2.   [[0,0,0], [0,0,0], [0,0,0]],
  3.   [[0,0,0], [0,0,0], [0,0,0]],
  4.   [[0,0,0], [0,0,0], [0,0,0]]
  5. ]
复制代码

正确写法应该是用三层循环:

方法1:三层for循环(最清晰)

  1. A = []
  2. for i in range(3):
  3.     layer = []
  4.     for j in range(3):
  5.         row = [0] * 3
  6.         layer.append(row)
  7.     A.append(layer)
复制代码

方法2:列表推导式(最简洁)

  1. A = [[[0 for _ in range(3)] for _ in range(3)] for _ in range(3)]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 23:10 | 显示全部楼层
你的代码存在几个问题:

1. 语法错误:代码中出现了不完整的表达式 *3,前面缺少列表
2. 逻辑错误:循环条件 range(i) 导致内层循环次数随外层变化
3. 变量赋值混乱:多次重新赋值 A

正确的三维列表创建方法如下:

方法一:使用三重循环


  1. # 创建一个3x3x3的三维列表,初始值为0
  2. result = []
  3. for i in range(3):
  4.     layer = []
  5.     for j in range(3):
  6.         row = []
  7.         for k in range(3):
  8.             row.append(0)  # 可以改为其他值
  9.         layer.append(row)
  10.     result.append(layer)

  11. print(result)
复制代码


方法二:使用列表推导式(更简洁)


  1. # 创建一个3x3x3的三维列表,初始值为0
  2. result = [[[0 for k in range(3)] for j in range(3)] for i in range(3)]
  3. print(result)
复制代码


方法三:如果需要更灵活地填充数据


  1. # 创建一个三维列表,填充特定模式的数据
  2. result = []
  3. for i in range(3):
  4.     layer = []
  5.     for j in range(3):
  6.         row = []
  7.         for k in range(3):
  8.             row.append(i * 100 + j * 10 + k)  # 创建不同值
  9.         layer.append(row)
  10.     result.append(layer)

  11. print(result)
复制代码


输出结果将是:
[[[0, 1, 2], [10, 11, 12], [20, 21, 22]], [[100, 101, 102], [110, 111, 112], [120, 121, 122]], [[200, 201, 202], [210, 211, 212], [220, 221, 222]]]

你的代码主要问题是:
1. range(i) 当 i=0 时,内层循环不执行,所以第一行是空列表
2. 每次循环都重新赋值 A,丢失了之前的数据
3. 缺少正确的列表创建语句

建议使用方法二,它更简洁且易读。

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

使用道具 举报

发表于 昨天 10:22 | 显示全部楼层    本楼为最佳答案   
先看逻辑:

A = [0] * 3
生成 [0, 0, 0]。

第一层循环 for i in range(3):

每次把 A[i] 改为 [0]*3 → 得到一维列表 [0,0,0]

第二层循环 for j in range(i):

注意:range(i) 不会覆盖全部 j=0,1,2

它生成的是:

  • 当 i=0:range(0) → 不执行
  • 当 i=1:range(1) → 只执行 j=0
  • 当 i=2:range(2) → 执行 j=0,1

在这些位置把 A[i][j] 替换为 [0,0,0],但 只替换部分位置,不是整行。

结果自然会是一个“下三角区域变成三维列表,其余仍是整数 0”。

因此你的结果变成:

  1. [
  2. [0, 0, 0],
  3. [[0,0,0], 0, 0],
  4. [[0,0,0], [0,0,0], 0]
  5. ]
复制代码

代码并不是生成 3×3×3 结构,而是在不同位置替换部分值。


正确写法:生成 3×3×3 立方体

你想要的结果是:

  1. [
  2.   [[0,0,0], [0,0,0], [0,0,0]],
  3.   [[0,0,0], [0,0,0], [0,0,0]],
  4.   [[0,0,0], [0,0,0], [0,0,0]]
  5. ]
复制代码

正确写法应该是用三层循环:

方法1:三层for循环(最清晰)

  1. A = []
  2. for i in range(3):
  3.     layer = []
  4.     for j in range(3):
  5.         row = [0] * 3
  6.         layer.append(row)
  7.     A.append(layer)
复制代码

方法2:列表推导式(最简洁)

  1. A = [[[0 for _ in range(3)] for _ in range(3)] for _ in range(3)]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:26 | 显示全部楼层
不二如是 发表于 2025-12-11 10:22
先看逻辑:

A = [0] * 3

请问小甲鱼老师,如果我把代码改成以下的情况,逻辑上是不是就对了(注:把内循环语句由for j in range(i)改成for j in range(3))?

A = [0] * 3
for i in range(3):
    A[i] = [0] * 3
    for j in range(3):
        A[i][j] = [0] * 3
print(A)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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