如何基于sample_context字段分组提取字典列表中的键值对?
解决方案
你的核心需求是根据sample_context的内容,筛选出对应的数字键值对(比如18421: u'1191'这类)。以下是两种可行的实现方式:
方式一:构建上下文映射(适合多次查询)
先把所有数据按sample_context分组,后续可以快速查询任意上下文对应的键值对:
# 你的原始数据 x = [ {"sample": {"sample_context": {"board": u'9', "encoder": u'1'}, 18421: u'1191'}}, {"sample": {"sample_context": {"board": u'5', "encoder": u'1'}, 18422: u'2251'}}, {"sample": {"sample_context": {"board": u'9', "encoder": u'1'}, 18423: u'2291'}}, {"sample": {25680: u'3321', "sample_context": {"board": u'2', "encoder": u'1'}}}, {"sample": {"sample_context": {"board": u'9', "encoder": u'1'}, 29100: u'5591'}} ] # 构建上下文到键值对的映射 context_map = {} for item in x: sample_data = item["sample"] # 提取上下文并移除该字段,得到目标键值对 ctx = sample_data.pop("sample_context") # 将字典形式的上下文转为可哈希的元组(字典不能作为字典的键) ctx_key = tuple(sorted(ctx.items())) # 合并相同上下文的键值对 if ctx_key in context_map: context_map[ctx_key].update(sample_data) else: context_map[ctx_key] = sample_data.copy() # 查询特定上下文的结果 target_ctx = {"board": u'9', "encoder": u'1'} target_key = tuple(sorted(target_ctx.items())) print(context_map.get(target_key, {})) # 输出: {18421: u'1191', 18423: u'2291', 29100: u'5591'}
方式二:直接筛选单次查询的结果
如果只需要查询一次特定上下文,不用构建映射,直接遍历筛选即可:
target_ctx = {"board": u'9', "encoder": u'1'} result = {} for item in x: sample_data = item["sample"] if sample_data["sample_context"] == target_ctx: # 复制数据并移除上下文字段 temp = sample_data.copy() temp.pop("sample_context") result.update(temp) print(result) # 输出: {18421: u'1191', 18423: u'2291', 29100: u'5591'}
说明
你之前用的[sample_sent['sample'] for sample_sent in x]只是取出了每个sample对象,但没有分离sample_context和目标键值对,也没有做上下文匹配。上面的代码通过移除sample_context字段获取目标键值对,再通过上下文匹配筛选出你需要的结果。
内容的提问来源于stack exchange,提问作者Kumar Roshan Mehta
相关产品推荐
相关产品推荐

