Python高效实现:为空值字典键替换为嵌套字典
问题描述
现有一个字典存在键已存在但值为空的情况,示例字典:
dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}
需要将其转换为:
dct = {'ID': {'link': '','value': ''}, 'gender': 'male', 'age': '20', 'weight': {'link': '','value': ''}, 'height': '5.7'}
要求把值为空的ID和weight键替换为指定嵌套字典,寻求最具时间效率的实现方式。尝试过以下代码:
def update(orignal, addition): for k, v in addition.items(): if k not in orignal: orignal[k] = v else: if isinstance(v, dict): update(orignal[k], v) elif isinstance(v, list): for i in range(len(v)): update(orignal[k][i], v[i]) else: if not orignal[k]: orignal[k] = v
运行时出现错误:TypeError: 'str' object does not support item assignment。
高效实现方案
错误原因
你的代码出错是因为当original[k]是空字符串(比如ID对应的''),你尝试调用update(original[k], v)时,空字符串是不可变的str类型,没法像字典那样做item赋值,所以报错。
最优实现(O(n)时间复杂度)
直接遍历原字典的键值对,对目标键(ID、weight)且值为空的情况进行替换,这是时间效率最高的方式,只需要一次遍历:
def transform_dict(dct): # 定义要替换的目标键和对应的嵌套字典 target_keys = {'ID', 'weight'} replacement = {'link': '', 'value': ''} for k, v in dct.items(): if k in target_keys and v == '': dct[k] = replacement.copy() # 用copy避免所有键共享同一个字典对象 return dct # 测试示例 dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'} transformed_dct = transform_dict(dct) print(transformed_dct)
代码说明
- 时间复杂度O(n),n是字典的键数量,一次遍历完成所有操作,效率拉满。
- 用
replacement.copy()是为了防止所有目标键指向同一个字典实例,后续修改其中一个时不会影响其他。 - 如果不想原地修改原字典,可以先创建副本再操作,比如
new_dct = dct.copy(),再遍历new_dct。
要是需要动态指定目标键和替换内容,也可以把它们作为参数传入函数:
def transform_dict(dct, target_keys, replacement): for k, v in dct.items(): if k in target_keys and v == '': dct[k] = replacement.copy() return dct # 调用示例 dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'} result = transform_dict(dct, {'ID', 'weight'}, {'link': '', 'value': ''})
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

