You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中按自定义相邻不重复规则对嵌套列表排序的实现问题

Python中按自定义相邻不重复规则对嵌套列表排序的实现问题

看起来你需要实现一个自定义的嵌套列表排序逻辑,核心要求是让相邻子列表之间满足特定的数值不重复约束,还提到了几个循环链式的val0顺序参考。先帮你理清楚需求细节,再解决问题:

需求明确

给定嵌套列表lts2,每个子列表结构为[val0, ..., val3, val4, val5],排序后需满足:

  • 对任意相邻的两个子列表a(前)和b(后):
    1. a的后两个元素a[4:]不能包含b的第一个元素b[0]
    2. b的后两个元素b[4:]不能包含a的第一个元素a[0]
  • 你提到了几个循环链参考(如15->14->13->12->15、11->10->9->8->11),即优先让这些val0的子列表按这个顺序排列(需满足上述约束)

现有代码的问题

你写的从后往前交换的逻辑,只能局部调整当前元素和前一个元素的关系,没有考虑全局的相邻约束(比如当前元素和后一个元素的匹配),也无法处理循环链中不符合约束的情况,所以很难得到完全符合要求的排序结果。

解决方案:回溯法寻找全局有效排序

因为这是一个全局约束的排列问题,小数据量(你的输入是16个子列表)下,用回溯法可以高效找到符合要求的排序。思路是:

  1. 定义一个判断函数,检查两个子列表是否可以相邻(满足上述两个约束)
  2. 用回溯法尝试所有可能的排列,找到第一个符合要求的完整顺序

完整代码实现

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("不存在满足所有约束的排序")

代码说明

  1. can_adjacent函数严格按照你的需求,检查两个子列表是否可以相邻
  2. find_valid_order用回溯法尝试所有可能的排列,一旦找到符合要求的完整顺序就返回(保证效率)
  3. 运行后会输出一个完全满足约束的排序结果,你也可以根据需要调整回溯逻辑(比如优先选择你提到的循环链中的子列表)

优化思路

如果后续数据量变大,回溯法效率会降低,可以优化为:

  • 先为每个子列表统计“可相邻的子列表集合”,减少无效尝试
  • 采用启发式搜索:优先选择可相邻选项最少的子列表,快速缩小搜索范围

备注:内容来源于stack exchange,提问作者Alex Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:59:51