如何基于字符串组合列表生成符合规则的Python矩阵
高效生成目标矩阵的实现方案
嘿,我看你之前生成目标列表的代码绕了不少弯路,而且矩阵生成效率很低,咱们来把整个流程优化得简洁又高效~
第一步:优化生成目标字符串列表
你原来用itertools.permutations加额外的0再做过滤处理,其实完全可以用itertools.product直接生成包含自身组合的2长度笛卡尔积,一行代码就能得到你需要的16个元素列表:
import itertools # 直接生成所有2长度组合(含自身重复),并转换为字符串列表 target_list = [''.join(pair) for pair in itertools.product('ABCD', repeat=2)]
生成的target_list就是你需要的:['AB', 'AC', 'AD', 'BA', 'BC', 'BD', 'CA', 'CB', 'CD', 'DA', 'DB', 'DC', 'AA', 'BB', 'CC', 'DD']
这个方法没有多余的循环和过滤操作,效率比原来的实现高很多。
第二步:高效生成规则矩阵
接下来我们按照规则生成矩阵,核心思路是先建立字符到列索引的映射,然后通过索引快速定位需要修改的位置,避免不必要的遍历:
# 建立字符与列索引的映射,方便快速定位列位置 char_index_map = {'A': 0, 'B': 1, 'C': 2, 'D': 3} result_matrix = [] for s in target_list: # 初始化每行所有元素为2 current_row = [2] * 4 idx1 = char_index_map[s[0]] idx2 = char_index_map[s[1]] if s[0] == s[1]: # 字符串两个字符相同,对应列设为1 current_row[idx1] = 1 else: # 字符串两个字符不同,对应两列设为3 current_row[idx1] = 3 current_row[idx2] = 3 # 将字符串本身加入行首,和示例格式保持一致 result_matrix.append([s] + current_row)
验证输出结果
如果要打印出和你示例一致的格式,可以用下面的代码:
for row in result_matrix: print(' '.join(map(str, row)))
输出结果会完全符合你的要求,比如:
AB 3 3 2 2 AC 3 2 3 2 AD 3 2 2 3 BA 3 3 2 2 BC 2 3 3 2 BD 2 3 2 3 CA 3 2 3 2 CB 2 3 3 2 CD 2 2 3 3 DA 3 2 2 3 DB 2 3 2 3 DC 2 2 3 3 AA 1 2 2 2 BB 2 1 2 2 CC 2 2 1 2 DD 2 2 2 1
整个实现的时间复杂度是O(n)(n为元素个数16),每个步骤都没有冗余操作,相比你之前的手动式实现效率提升非常明显。
内容的提问来源于stack exchange,提问作者Starter
相关产品推荐
相关产品推荐

