Python:如何将未匹配特定键映射到指定值?求实现方案
特定键映射指定值的代码实现方案
我想要编写代码,通过对比键名获取对应值并赋值,但对于未匹配的特定键,需要在同一循环迭代时将其映射到指定的对应值。例如:non_resource_bookable_capacity需映射到data中的ert值,utc_start_at需映射到data中的time值,而非随机映射。现有代码无法实现该逻辑,以下是代码示例及预期输出:
现有代码
import json data = {"time": "2018-09-29T16:45:00+0000","test":"gfds","ert":"erty"} #data1 = json.loads(json_data) # json_data is a placeholder for your json keys = ['results_count', 'test', 'utc_start_at', 'non_resource_bookable_capacity'] def find_key_value_pairs(q, keys, dicts=None): if not dicts: dicts = [q] q = [q] data = q.pop(0) if isinstance(data, dict): data = data.values() for d in data: dtype = type(d) if dtype is dict or dtype is list: q.append(d) if dtype is dict: dicts.append(d) if q: return find_key_value_pairs(q, keys, dicts) return [(k, v) for d in dicts for k, v in d.items() if k in keys] results = find_key_value_pairs(data, keys) json_Obj={} for k, v in results: json_Obj.update({k:v}) print(json_Obj)
预期输出
{ 'utc_start_at': '2018-09-29T16:45:00+0000', 'non_resource_bookable_capacity': 'erty', 'test': 'gfds' }
解决方案
核心思路是提前定义特殊键的映射规则,在完成常规键匹配后,单独处理这些需要特殊映射的键,确保它们获取到指定的对应值。同时可以过滤掉原始数据中不存在的键(比如results_count)。
修改后的完整代码如下:
import json data = {"time": "2018-09-29T16:45:00+0000","test":"gfds","ert":"erty"} keys = ['results_count', 'test', 'utc_start_at', 'non_resource_bookable_capacity'] # 定义特殊键的映射规则:目标键 -> 原始数据中的源键 key_mapping = { 'utc_start_at': 'time', 'non_resource_bookable_capacity': 'ert' } def find_key_value_pairs(q, keys, dicts=None): if not dicts: dicts = [q] q = [q] data = q.pop(0) if isinstance(data, dict): data = data.values() for d in data: dtype = type(d) if dtype is dict or dtype is list: q.append(d) if dtype is dict: dicts.append(d) if q: return find_key_value_pairs(q, keys, dicts) return [(k, v) for d in dicts for k, v in d.items() if k in keys] # 收集常规匹配的键值对 results = find_key_value_pairs(data, keys) json_Obj = dict(results) # 处理特殊映射的键 for target_key, source_key in key_mapping.items(): if source_key in data: json_Obj[target_key] = data[source_key] # 过滤掉原始数据中不存在的键(可选,根据需求调整) json_Obj = {k: v for k, v in json_Obj.items() if k in keys and v is not None} print(json_Obj)
代码说明
- 映射规则定义:通过
key_mapping字典明确指定需要特殊处理的目标键和对应的原始数据源键,逻辑清晰且易于维护。 - 常规匹配保留:保留原有的
find_key_value_pairs函数,用于获取原始数据中直接匹配的键值对(比如test)。 - 特殊键赋值:遍历映射规则,从原始数据中取出对应的值,覆盖或添加到结果字典中。
- 可选过滤:最后过滤掉原始数据中不存在的键(比如
results_count),确保输出与预期一致。
运行上述代码后,输出结果将完全符合预期。
内容的提问来源于stack exchange,提问作者ditil
相关产品推荐
相关产品推荐

