本文介绍如何在python中筛选嵌套字典(即值为列表的字典),删除长度不满足要求的条目,并将剩余项的键按顺序重新编号为从0开始的连续整数。
在处理以索引为键、列表为值的字典(类似稀疏数组或带标签的序列)时,常需根据值的特征(如长度)进行过滤,再将结果规整为紧凑、连续的序号结构。直接在遍历中修改字典(如使用 del a[i])会导致键序混乱,且无法自动重映射;因此推荐采用「先过滤、后重建」的函数式思路。
以下是一个清晰、安全且可读性强的实现:
a = {0: [1, 2], 1: [3, 4, 5], 2: [6, 7, 8]}
# 步骤1:筛选出所有值长度为3的项(保留原键值对)
filtered_items = [(k, v) for k, v in a.items() if len(v) == 3]
# 步骤2:按键升序排序(确保逻辑顺序,尤其当原始键无序时)
sorted_items = sorted(filtered_items, key=lambda x: x[0])
# 步骤3:用enumerate生成新键(0, 1, 2...),构建重编号字典
reordered = {i: v for i, (k, v) in enumerate(sorted_items)}
print(reordered) # 输出:{0: [3, 4, 5], 1: [6, 7, 8]}✅ 关键说明:
? 进阶提示:若需封装为通用函数,可进一步参数化长度阈值与排序依据:
def reorder_by_value_length(d, target_len, sort_by_key=True):
items = [(k, v) for k, v in d.items() if len(v) == target_len]
if sort_by_key:
items.sort(key=lambda x: x[0])
return {i: v for i, (k, v) in enumerate(item
s)}这样即可灵活复用于不同场景,例如 reorder_by_value_length(a, target_len=2) 获取长度为2的所有项并重编号。