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

Python 尝试从嵌套字典中提取键和值时出现问题?,python,dictionary,recursion,data-structures,list-comprehension,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 item

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

{

    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]

}
让我们关注
概念列表
(注意,我省略了不相关的信息,只是为了可视化):

一般来说,从
content\u list
键,如何提取到新的dict
sementity
semtheme\u list
id
s值(如果存在)?。例如,新词典应具有以下结构:
(*)

另外,如果元素不存在,我想添加一个
NaN
值。到目前为止,我尝试使用:


但是,我没有像
(*)

这样的dict中的值,您可以通过循环您的
概念\u条目来构建您的“精液”列表,如:

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"]]
但这不会给您提供新的dict结构,因为这在Python中是无效的结构。它将包含提取值的列表。当然,我强烈建议您在解析像这样的所有内容之前添加一些验证,除非您确定您的数据始终与您提供的数据相同


另外,我一点也不知道你在“dict中的值,如
(*)

下的意思。你可以通过循环你的
概念项来建立你的“精液”列表,如:

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"]]
但这不会给您提供新的dict结构,因为这在Python中是无效的结构。它将包含提取值的列表。当然,我强烈建议您在解析像这样的所有内容之前添加一些验证,除非您确定您的数据始终与您提供的数据相同


另外,我一点也不知道“dict中的值,如
(*)

下面是一种方法,使用更通用的标签:

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

我想提取必须是一个列表,而不是一个目录。

这里有一种方法,使用更通用的标签:

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

我猜提取必须是列表,而不是dict。

您的数据是JSON格式的字符串,不是有效的Python dict/list结构。dict有键、值对。你更像是在构建一个集合。你希望你的最终结果是什么样的?比如
(*)
(即
{'sementity':'A','semtheme\u list':'NaN',{'sementity':'B','semtheme\u list':'C',}
)我不知道这是什么意思。如果您正在寻找一个复杂的列表理解,您可以这样做:
[{'sementity':item.get('sementity',{}).get('id'),'semtheme_-list':next(iter(item.get('semtheme_-list',[]),{}.get('id')}用于原始['concept_-list']]中的项。
您的数据是一个JSON格式的字符串,不是有效的Python dict/list结构。dict具有键、值对。你更像是在构建一个集合。你希望你的最终结果是什么样的?比如
(*)
(即
{'sementity':'A','semtheme\u list':'NaN',{'sementity':'B','semtheme\u list':'C',}
)我不知道这是什么意思。如果您正在寻找一个复杂的列表理解,您可以这样做:
[{'sementity':item.get('sementity',{}).get('id'),'semtheme_-list':next(item.get('semtheme_-list',[]),{}.get('id')}用于原始['concept_-list']].
我想说的是
(*)
表示预期输出example@tumbleweed-您说过您已经将JSON转换为Python
dict
结构-如果您没有,在循环之前,请确保您已经解析了它(即
data=JSON.loads(your_JSON)
)是的,现在是dict!。。。谢谢我认为你想把JSON看作JSON,而不是DICTI,也忘了提到我想提取表单,并把它添加到最终的DICT中,问题是表单在外面。我该怎么做呢?我试着:
“form”:s[“form”]
那么准确吗?…@tumbleweed-是的,你可以将任何可用的数据添加到你的循环中,得到的
dict
-
“form”:s[“form”]
非常好。我想说的是
(*)
表示预期输出example@tumbleweed-您说过您已经将JSON转换为Python
dict
结构-如果您没有,在循环之前,请确保您已经解析了它(即
data=JSON.loads(your_JSON)
)是的,现在是dict!。。。谢谢我认为你想把JSON看作JSON,而不是DICTI,也忘了提到我想提取表单,并把它添加到最终的DICT中,问题是表单在外面。我该怎么做?我试着:
“form”:s[“form”]
准确吗?…@tumbleweed-是的,你可以将任何可用的数据添加到你的循环中,得到的
dict
-
“form”:s[“form”]
很好。
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}]