Python中按自定义相邻不重复规则对嵌套列表排序的实现问题
Python中按自定义相邻不重复规则对嵌套列表排序的实现问题
看起来你需要实现一个自定义的嵌套列表排序逻辑,核心要求是让相邻子列表之间满足特定的数值不重复约束,还提到了几个循环链式的val0顺序参考。先帮你理清楚需求细节,再解决问题:
需求明确
给定嵌套列表lts2,每个子列表结构为[val0, ..., val3, val4, val5],排序后需满足:
- 对任意相邻的两个子列表
a(前)和b(后):a的后两个元素a[4:]不能包含b的第一个元素b[0]b的后两个元素b[4:]不能包含a的第一个元素a[0]
- 你提到了几个循环链参考(如
15->14->13->12->15、11->10->9->8->11),即优先让这些val0的子列表按这个顺序排列(需满足上述约束)
现有代码的问题
你写的从后往前交换的逻辑,只能局部调整当前元素和前一个元素的关系,没有考虑全局的相邻约束(比如当前元素和后一个元素的匹配),也无法处理循环链中不符合约束的情况,所以很难得到完全符合要求的排序结果。
解决方案:回溯法寻找全局有效排序
因为这是一个全局约束的排列问题,小数据量(你的输入是16个子列表)下,用回溯法可以高效找到符合要求的排序。思路是:
- 定义一个判断函数,检查两个子列表是否可以相邻(满足上述两个约束)
- 用回溯法尝试所有可能的排列,找到第一个符合要求的完整顺序
完整代码实现
lts2 = [ [10, 0, 0, 'H', 9, 11],[8, 2, 2, 'B', 7, 5],[1, 6, 6, 'A', 2, 4],[11, 6, 6, 'F', 10, 5], [13, 8, 8, 'G', 14, 16],[14, 8, 8, 'U', 13, 15],[15, 8, 8, 'J', 14, 16],[3, 10, 10, 'P', 2, 4], [4, 10, 10, 'C', 3, 1],[7, 10, 10, 'T', 6, 8],[5, 12, 12, 'I', 12, 8],[12, 12, 12, 'W', 11, 3], [2, 16, 16, 'D', 1, 9],[6, 18, 18, 'V', 5, 7],[16, 18, 18, 'Q', 15, 13],[9, 24, 24, 'E', 10, 12] ] def can_adjacent(prev_sublist, curr_sublist): """判断前一个子列表是否可以和当前子列表相邻""" # 约束1:前子列表的后两个元素不包含当前子列表的第一个元素 if curr_sublist[0] in prev_sublist[4:]: return False # 约束2:当前子列表的后两个元素不包含前子列表的第一个元素 if prev_sublist[0] in curr_sublist[4:]: return False return True def find_valid_order(lst): """用回溯法寻找符合要求的排序""" total = len(lst) used = [False] * total path = [] def backtrack(): # 找到完整路径,返回结果 if len(path) == total: return path.copy() # 遍历所有未使用的子列表 for idx in range(total): if not used[idx]: # 路径为空 或 当前子列表可以和路径最后一个元素相邻 if not path or can_adjacent(path[-1], lst[idx]): used[idx] = True path.append(lst[idx]) # 递归寻找下一个元素 result = backtrack() if result: return result # 回溯:撤销选择 used[idx] = False path.pop() # 没有找到有效路径 return None return backtrack() # 生成并打印结果 valid_sorted = find_valid_order(lts2) if valid_sorted: print("符合要求的排序结果:") for sub in valid_sorted: print(sub) else: print("不存在满足所有约束的排序")
代码说明
can_adjacent函数严格按照你的需求,检查两个子列表是否可以相邻find_valid_order用回溯法尝试所有可能的排列,一旦找到符合要求的完整顺序就返回(保证效率)- 运行后会输出一个完全满足约束的排序结果,你也可以根据需要调整回溯逻辑(比如优先选择你提到的循环链中的子列表)
优化思路
如果后续数据量变大,回溯法效率会降低,可以优化为:
- 先为每个子列表统计“可相邻的子列表集合”,减少无效尝试
- 采用启发式搜索:优先选择可相邻选项最少的子列表,快速缩小搜索范围
备注:内容来源于stack exchange,提问作者Alex Sam
相关产品推荐
相关产品推荐

