如何对三元组列表按行列排序以生成指定矩阵结构?
解决方案
1. 按行+列排序
直接给sorted函数的key参数设置为元组(x[0], x[1]),就能实现先按行号升序排列,同一行内再按列号升序排列,完全匹配你需要的顺序:
lst = [(0, 0, 'C'), (0, 1, 'C'), (0, 2, 'C'), (0, 3, 'C'), (0, 4, 'C'), (1, 0, 'C'), (1, 4, 'C'), (1, 1, 'B'), (1, 2, 'B'), (1, 3, 'B'), (2, 0, 'C'), (2, 4, 'C'), (2, 1, 'B'), (2, 3, 'B'), (2, 2, 'A'), (3, 0, 'C'), (3, 4, 'C'), (3, 1, 'B'), (3, 2, 'B'), (3, 3, 'B'), (4, 0, 'C'), (4, 1, 'C'), (4, 2, 'C'), (4, 3, 'C'), (4, 4, 'C')] # 按行优先、列次之排序 sorted_lst = sorted(lst, key=lambda x: (x[0], x[1]))
排序后的结果片段如下:
[(0, 0, 'C'), (0, 1, 'C'), (0, 2, 'C'), (0, 3, 'C'), (0, 4, 'C'), (1, 0, 'C'), (1, 1, 'B'), (1, 2, 'B'), (1, 3, 'B'), (1, 4, 'C'), ...]
2. 生成直观的字符矩阵
如果需要把排序后的结果转换成二维字符矩阵(方便打印查看),可以按行提取字符:
# 获取最大行号和列号(假设坐标连续) max_row = max(x[0] for x in lst) max_col = max(x[1] for x in lst) # 构建矩阵 matrix = [] for row in range(max_row + 1): # 提取当前行的所有字符(已按列排序) row_chars = [char for r, c, char in sorted_lst if r == row] matrix.append(row_chars) # 打印矩阵 for line in matrix: print(''.join(line))
运行后输出:
CCCCC CBBBC CBABC CBBBC CCCCC
3. 按行分批输出元组
如果需要按行批量展示排序后的元组,可以用itertools.groupby按行号分组:
from itertools import groupby # 按行号分组(需确保列表已按行排序) for row_num, group in groupby(sorted_lst, key=lambda x: x[0]): print(f"第{row_num}行的元组:", list(group))
输出结果片段:
第0行的元组: [(0, 0, 'C'), (0, 1, 'C'), (0, 2, 'C'), (0, 3, 'C'), (0, 4, 'C')] 第1行的元组: [(1, 0, 'C'), (1, 1, 'B'), (1, 2, 'B'), (1, 3, 'B'), (1, 4, 'C')] ...
内容的提问来源于stack exchange,提问作者JJMendoza
相关产品推荐
相关产品推荐

