网格区域选取:如何将随机序号映射到Python二维列表对应位置
实现随机序号到二维列表的映射逻辑
要解决把1-based随机序号映射到二维列表的问题,核心是将线性序号转换为二维索引,具体实现步骤如下:
映射规则推导
序号从1开始,对应二维列表的0-based索引:
- 对任意序号
num,先转成0-based的线性位置:linear_pos = num - 1 - 行索引:
row = linear_pos // size(通过整除size确定所在行) - 列索引:
col = linear_pos % size(通过取模size确定所在列)
举个size=4的例子:
- num=1 → linear_pos=0 → row=0//4=0,col=0%4=0 → 对应
vertical[0][0] - num=5 → linear_pos=4 → row=4//4=1,col=4%4=0 → 对应
vertical[1][0] - num=12 → linear_pos=11 → row=11//4=2,col=11%4=3 → 对应
vertical[2][3]
修改后的完整代码
将映射逻辑整合到原代码中,替换全0初始化后的部分:
import random size = int(input("Size? (even) ")) area = size ** 2 half = area // 2 # 生成half个不重复的1~area的随机数 thechosenhalf = random.sample(range(1, area + 1), half) def printgrid(): for b in range(size): print(f"{b}[{' '.join(str(i) for i in vertical[b])}]") print(" ", end="") for b in range(size): print(f"{b} ", end="") # 初始化全0二维列表(用列表推导式更简洁) vertical = [[0 for _ in range(size)] for _ in range(size)] # 核心映射逻辑:遍历选中的序号,把对应位置设为1 for num in thechosenhalf: linear_pos = num - 1 row = linear_pos // size col = linear_pos % size vertical[row][col] = 1 printgrid()
验证示例
- 当
thechosenhalf为1~8时:
前两行的所有位置都会被设为1,输出符合预期:0[1 1 1 1] 1[1 1 1 1] 2[0 0 0 0] 3[0 0 0 0] 0 1 2 3 - 当
thechosenhalf = [12,5,16,2,8,9,15,3]时:
逐个计算每个序号对应的位置并设为1,最终输出和预期完全匹配。
内容的提问来源于stack exchange,提问作者RoyalPhrog
相关产品推荐
相关产品推荐

