如何基于字典值生成尽可能交错排列的键有序列表?
解决字典键的交错排列问题
先说说你现有代码的问题:
- 只遍历了字典一次,没有循环尝试把剩余的键插入到合适位置
- 用
is比较字符串值,这不是正确的字符串内容比较方式(应该用==,is对比的是对象身份而非内容) - 逻辑上没处理生成初始列表后,剩余键的二次插入逻辑
下面是实现需求的具体方案:
步骤思路
- 先把字典按值分组,把相同值的键归到同一个列表里
- 循环尝试从各个分组里取键加入结果列表,保证相邻元素的值不重复
- 直到一轮循环里没有任何元素能添加,剩下无法插入的键就归入剩余列表
代码实现
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
相关产品推荐
相关产品推荐

