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

如何基于字典值生成尽可能交错排列的键有序列表?

解决字典键的交错排列问题

先说说你现有代码的问题:

  • 只遍历了字典一次,没有循环尝试把剩余的键插入到合适位置
  • 用is比较字符串值,这不是正确的字符串内容比较方式(应该用==,is对比的是对象身份而非内容)
  • 逻辑上没处理生成初始列表后,剩余键的二次插入逻辑

下面是实现需求的具体方案:

步骤思路

  1. 先把字典按值分组,把相同值的键归到同一个列表里
  2. 循环尝试从各个分组里取键加入结果列表,保证相邻元素的值不重复
  3. 直到一轮循环里没有任何元素能添加,剩下无法插入的键就归入剩余列表

代码实现

from collections import defaultdict

d = {
    "a": "abc1",
    "b": "abc1",
    "c": "abc2",
    "d": "abc3",
    "e": "abc3",
    "f": "abc3",
    "g": "abc4"
}

# 按值分组,存储每个值对应的键列表
groups = defaultdict(list)
for key, val in d.items():
    groups[val].append(key)

result = []
added = True

# 循环尝试添加元素,直到一轮没有新元素加入
while added:
    added = False
    # 遍历分组的副本,避免遍历过程中修改原字典出问题
    for val in list(groups.keys()):
        current_group = groups[val]
        # 满足条件:分组不为空,且结果列表为空 或 最后一个元素的值不等于当前分组的值
        if current_group and (not result or d[result[-1]] != val):
            # 取出分组的第一个元素加入结果列表(用pop()取最后一个也可以,只是顺序不同)
            result.append(current_group.pop(0))
            added = True
            # 如果分组空了就删掉,减少后续遍历次数
            if not current_group:
                del groups[val]

# 收集剩余无法插入的键
remaining = []
for val in groups:
    remaining.extend(groups[val])

print("结果列表:", result)
print("剩余列表:", remaining)

运行结果

结果列表: ['a', 'c', 'd', 'g', 'b', 'e']
剩余列表: ['f']

逻辑说明

  • 分组操作把相同值的键归类,方便后续批量处理
  • 循环里每次遍历所有分组,只要找到符合条件(和结果列表最后一个元素值不同)的键就添加,直到没有新元素能加入
  • 剩余的键都是因为当前结果列表最后一个元素的值和它们的值相同,无法继续插入,所以归入剩余列表

内容的提问来源于stack exchange,提问作者Slacker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:55:17