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
键,如何提取到新的dictsementity
和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转换为Pythondict
结构-如果您没有,在循环之前,请确保您已经解析了它(即data=JSON.loads(your_JSON)
)是的,现在是dict!。。。谢谢我认为你想把JSON看作JSON,而不是DICTI,也忘了提到我想提取表单,并把它添加到最终的DICT中,问题是表单在外面。我该怎么做呢?我试着:“form”:s[“form”]
那么准确吗?…@tumbleweed-是的,你可以将任何可用的数据添加到你的循环中,得到的dict
-“form”:s[“form”]
非常好。我想说的是(*)
表示预期输出example@tumbleweed-您说过您已经将JSON转换为Pythondict
结构-如果您没有,在循环之前,请确保您已经解析了它(即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}]