【问题标题】:Problems while trying to extract keys and values from a nested dictionary?尝试从嵌套字典中提取键和值时出现问题?
【发布时间】:2017-12-14 15:52:04
【问题描述】:

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

{

    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_listids 值(如果存在)?例如,新字典应该有这样的结构(*):

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)

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

【问题讨论】:

  • 您的数据是 JSON 格式的字符串,不是有效的 Python dict/list 结构。
  • 一个字典有键值对。您正在构建它更像是一个集合。您希望最终结果如何?
  • 点赞(*)(即{ 'sementity':'A', 'semtheme_list':'NaN' } , { 'sementity':'B', 'semtheme_list':'C' } , ... }
  • 我不知道这意味着什么。如果你正在寻找一个复杂的列表理解,你可以这样做:[{'sementity': item.get('sementity', {}).get('id'), 'semtheme_list': next(iter(item.get('semtheme_list', [])), {}).get('id')} for item in original['concept_list']]

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


【解决方案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 中的无效结构。相反,它将包含提取值的列表。当然,我强烈建议您在解析这样的所有内容之前添加一些验证,除非您确定您的数据始终与您呈现的一样。

此外,我对您在“(*) 等字典中的值”下的含义一无所知

【讨论】:

  • 我的意思是(*)表示预期的输出示例
  • @tumbleweed - 你说你已经将你的 JSON 转换为 Python dict 结构 - 如果你没有,在循环之前确保你已经解析它(即@987654328 @)
  • 是的,好的,现在它是一个字典!...谢谢!..我以为您想将 json 视为 json,而不是字典
  • 我也忘了提到我想提取表格,并将其添加到最终的字典中,问题是表格在外面..我该怎么做?,我试过: "form": s["form"] 准确吗?...
  • @tumbleweed - 是的,您可以将循环中可用的任何数据添加到生成的dict - "form": s["form"] 中,非常好。
【解决方案2】:

这是一种使用更通用标签的方法:

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}]

我猜extraction 一定是一个列表,而不是一个字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多