我有一个嵌套字典,结构如下:
{
status: {3 items},
entity_list: [],
concept_list: [
{6 items},
{7 items},
{7 items},
{7 items},
{6 items},
{6 items},
{7 items},
{7 items},
{6 items}
],
time_expression_list: [],
money_expression_list: [],
quantity_expression_list: [1 item],
other_expression_list: [],
quotation_list: [],
relation_list: [10 items]
}
让我们关注concept_list
(请注意,我为了可视化目的而省略了无关信息):
concept_list: [
{
form: "length",
id: "566859a9e3",
sementity: {
class: "class",
fiction: "nonfiction",
id: "A",
type: "None"
},
semld_list: [1 item],
variant_list: [2 items],
relevance: "100"
},
{
form: "length",
id: "f06dc65ae1",
sementity: {
class: "class",
fiction: "nonfiction",
id: "B",
type: "None"
},
semld_list: [1 item],
semtheme_list: [
{
id: "C",
type: "None"
}
],
variant_list: [2 items],
relevance: "100"
},
{7 items},
{7 items},
{6 items},
{6 items},
{7 items},
{7 items},
{6 items},
{6 items},
{7 items},
{7 items},
{6 items},
{6 items},
{6 items}
]
一般来说,从content_list
键,我如何提取到新的词典sementity
和semtheme_list
' s id
s价值(如果存在)?例如,新词典应具有此结构(*)
:
new_dict = {
{ 'form: 'length',
'sementity':'A',
'semtheme_list':'NaN'
}
,
{ 'form: 'length',
'sementity':'B',
'semtheme_list':'C'
}
,
...
}
此外,如果元素不存在,我想添加NaN
值。到目前为止,我尝试使用mdict:
from mdict import MDict
for item in a_dict:
a = MDict(item)
print(a.get('concept_list:id'))
并且
for t in a_dict:
#print(t)
if 'concept_list' in t:
myvalues = [i['concept_list'] for i in t if 'concept_list' in i]
print(myvalues)
但是我没有得到像(*)
这样的词典中的值。
答案 0 :(得分:1)
您可以通过循环显示concept_entry
值来构建“sementities”列表,如:
new_list = []
for s in data["concept_list"]:
new_list.append({
"sementity": s["sementity"]["id"],
"semtheme_list": s["semtheme_list"][0]["id"] if "semtheme_list" in s else "NaN"
})
或者,如果您只需一步即可完成所有工作:
new_list = [{"sementity": s["sementity"]["id"],
"semtheme_list": s["semtheme_list"][0]["id"]
if "semtheme_list" in s else "NaN"} for s in data["concept_list"]]
但是这不会给你new_dict
结构,因为这将是Python中的无效结构。它将包含一个提取值列表。当然,我强烈建议您在解析所有内容之前添加一些验证,除非您确定您的数据始终与您所呈现的一样。
另外,我对你在(*)
这样的词典中的值中的含义并不是最微妙的想法
答案 1 :(得分:1)
这是一种方法,使用更通用的标签:
SET
我猜from pylab import *
data={ randint(10):{randint(10):randint(10) for i in range(3)} for i in range(3)}
# {1: {0: 1, 1: 4, 8: 6}, 2: {4: 8, 6: 8, 9: 4}, 5: {1: 7, 3: 1, 9: 2}}
extraction = [ {k:(d[k] if k in d else NaN) for k in (0,1)} for d in data.values()]
# [{0: 1, 1: 4}, {0: nan, 1: nan}, {0: nan, 1: 7}]
必须是一个列表,而不是一个字典。