Python实现基于排序后列表的字符串列表重排功能
问题解决:基于字符串排序结果重排原列表
需求概述
给定初始字符串列表l,需按以下规则生成重排后的列表n:
- 对
l中每个字符串单独排序,得到中间列表k(元素位置与原列表一一对应) - 将
k排序得到列表o - 按照
o的顺序,匹配原列表l中对应排序结果的元素,组成最终列表n
示例
l = ['cbc', 'adb', 'dab', 'acb', 'bbc', 'aca', 'bbb', 'aab', 'cad', 'bba'] print(f(l)) # 输出: ['aab', 'aca', 'bba', 'acb', 'adb', 'dab', 'cad', 'bbb', 'bbc', 'cbc']
小测试用例
- 初始列表:
l = ['be', 'tc', 'ka'] - 中间列表
k(每个元素为原元素排序结果):['be', 'ct', 'ak'] - 排序后的
o:['ak', 'be', 'ct'] - 期望结果
n:['ka', 'be', 'tc']
现有代码问题分析
你已经正确生成了中间列表transition_string(即k)和排序后的o,但后续的enu_list逻辑冗余且未完成重排核心步骤——需要关联排序结果与原列表元素,同时处理重复排序结果的顺序问题。
通用函数实现
def f(x): # 将每个原字符串、其排序结果、原索引绑定为元组 paired_items = [("".join(sorted(s)), idx, s) for idx, s in enumerate(x)] # 先按排序后的字符串排序,排序结果相同时按原索引保持原顺序 paired_items_sorted = sorted(paired_items, key=lambda item: (item[0], item[1])) # 提取排序后的原字符串,得到最终结果 return [item[2] for item in paired_items_sorted] # 验证示例 l = ['cbc', 'adb', 'dab', 'acb', 'bbc', 'aca', 'bbb', 'aab', 'cad', 'bba'] print(f(l)) # 输出符合预期 # 验证小测试用例 l_small = ['be', 'tc', 'ka'] print(f(l_small)) # 输出: ['ka', 'be', 'tc']
代码说明
- 绑定元组:通过
enumerate获取原索引,将排序结果、原索引、原字符串打包,确保重复排序结果的元素能保留原列表中的相对顺序。 - 排序逻辑:使用
sorted时,先以排序后的字符串为第一排序键,原索引为第二排序键,实现稳定排序。 - 提取结果:从排序后的元组列表中提取原字符串,得到重排后的最终列表。
内容的提问来源于stack exchange,提问作者Aggelos Kozonakis
相关产品推荐
相关产品推荐

