尝试从嵌套字典中提取键和值时出现问题?

时间:2017-07-10 19:20:44

标签: python dictionary recursion data-structures list-comprehension

我有一个嵌套字典,结构如下:

{

    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键,我如何提取到新的词典sementitysemtheme_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)

但是我没有得到像(*)这样的词典中的值。

2 个答案:

答案 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}] 必须是一个列表,而不是一个字典。