如何按特定规则替换numpy数组元素:教室座位自动分配
解决方案
要实现从最后一排开始、从右到左替换可用座位的规则,可以按以下步骤操作:
核心思路
- 生成所有座位的坐标,并按照**行号降序(最后一排优先)、列号降序(每行从右到左)**的规则排序
- 筛选出其中标记为
"Available"的座位坐标 - 根据可用座位情况执行替换或提示无座
代码实现
单姓名替换示例
import numpy as np def assign_seat(classroom, name): # 获取教室的行数和列数 rows, cols = classroom.shape # 生成所有座位坐标,按行从后到前、每行从右到左排序 sorted_coords = [] for row in reversed(range(rows)): for col in reversed(range(cols)): sorted_coords.append((row, col)) # 遍历排序后的坐标,找到第一个可用座位 for coord in sorted_coords: if classroom[coord] == "Available": classroom[coord] = name print(f"已为{name}分配座位:{coord}") return classroom # 无可用座位时的提示 print("无可用座位") return classroom # 测试示例 classroom1 = np.array([["Martha", "Available"], ["Max", "Anahi"], ["Available", "Available"], ["Alexis", "Rigel"]]) # 为Alex分配座位 classroom1 = assign_seat(classroom1, "Alex") print("\n更新后的教室:") print(classroom1) # 再为Zoe分配座位 classroom1 = assign_seat(classroom1, "Zoe") print("\n再次更新后的教室:") print(classroom1)
批量替换多个姓名示例
如果需要一次性给多人分配座位,可以扩展函数:
def assign_seats(classroom, names): rows, cols = classroom.shape # 生成符合规则的排序坐标 sorted_coords = [] for row in reversed(range(rows)): for col in reversed(range(cols)): sorted_coords.append((row, col)) # 筛选所有可用座位 available_coords = [coord for coord in sorted_coords if classroom[coord] == "Available"] if not available_coords: print("无可用座位") return classroom # 按顺序分配,最多分配可用座位数量的姓名 assign_count = min(len(names), len(available_coords)) for i in range(assign_count): classroom[available_coords[i]] = names[i] print(f"已为{names[i]}分配座位:{available_coords[i]}") if assign_count < len(names): print(f"剩余{len(names)-assign_count}人无法分配座位,教室已满") return classroom # 测试批量分配 classroom2 = np.array([["Martha", "Available"], ["Max", "Anahi"], ["Available", "Available"], ["Alexis", "Rigel"]]) classroom2 = assign_seats(classroom2, ["Alex", "Zoe", "Luna"]) print("\n批量分配后的教室:") print(classroom2)
代码说明
reversed(range(rows)):生成从最后一行到第一行的行号序列(比如4行教室的行号为3,2,1,0)reversed(range(cols)):生成每行从右到左的列号序列(比如2列每行的列号为1,0)- 先排序再筛选可用座位,确保替换顺序严格符合题目要求
内容的提问来源于stack exchange,提问作者Zeirios
相关产品推荐
相关产品推荐

