Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法提取字典的子集_Python - Fatal编程技术网

Python 有没有办法提取字典的子集

Python 有没有办法提取字典的子集,python,Python,我想从一个json文件创建一个字典,但我所做的一切都没有成功 json\u文件=[ {'original_block':'94.142.136.0/21', “已转移区块”:“94.142.136.0/21”, “发件人”:“MAROSNET电信有限责任公司”, “致”:“NTX科技股份有限公司”, “日期”:2019年6月28日, “transferType”:“策略” }, {'original_block':'185.2.4.0/22', “转移块”:“185.2.4.0/22”, ‘fr

我想从一个json文件创建一个字典,但我所做的一切都没有成功

json\u文件=[
{'original_block':'94.142.136.0/21',
“已转移区块”:“94.142.136.0/21”,
“发件人”:“MAROSNET电信有限责任公司”,
“致”:“NTX科技股份有限公司”,
“日期”:2019年6月28日,
“transferType”:“策略”
},
{'original_block':'185.2.4.0/22',
“转移块”:“185.2.4.0/22”,
‘from’:‘REGISTER.IT S.P.A.’,
“收件人”:注册S.P.A,
“日期”:2019年7月1日,
“转让类型”:“合并或收购”
}
]
新=['原始块','日期']
newd={key:key的值,json_文件中的值。items()如果key in new}
打印(新增)
它给出一条错误消息
“list”对象没有属性“items”

我想

newd={'94.142.136.0/21':'28/06/2019','185.2.4.0/22':'01/07/2019'}
简单的一行:

newd = {d[new[0]]: d[new[1]] for d in json_file}
简单一行:

newd = {d[new[0]]: d[new[1]] for d in json_file}

假设
new
始终是两个元素(因为您使用第一个元素作为键,第二个元素作为值)


问题是
json_文件
是一个字典列表
[{},{}]
,而不是一个字典
{}
,因此当您尝试执行
json_文件.items()
时,它会崩溃,因为列表没有items()操作

假设
new
总是两个元素(因为您使用第一个元素作为键,第二个元素作为值)


问题是
json_文件
是一个字典列表[{},{}],而不是一个字典{},所以当你尝试执行
json_文件.items()
时,它会崩溃,因为列表没有items()操作

你可以使用
dict
来理解:

data = [{'original_block': '94.142.136.0/21', 'transferred_blocks': '94.142.136.0/21', 'from': 'MAROSNET Telecommunication Company LLC', 'to': 'NTX Technologies s.r.o.', 'date': '28/06/2019', 'transferType': 'POLICY'}, {'original_block': '185.2.4.0/22', 'transferred_blocks': '185.2.4.0/22', 'from': 'REGISTER.IT S.P.A.', 'to': 'REGISTER S.P.A.', 'date': '01/07/2019', 'transferType': 'MERGER_OR_ACQUISITION'}]
new = ['original_block', 'date']
result = dict([c[i] for i in new] for c in data)
输出:

{'94.142.136.0/21': '28/06/2019', '185.2.4.0/22': '01/07/2019'}
编辑:作为预防措施,可以使用
all
进行检查,以确保缺少的值不会引发
KeyError

dict([c[i] for i in new] for c in data if all(j in c for j in new))

您可以将理解与
dict
结合使用:

data = [{'original_block': '94.142.136.0/21', 'transferred_blocks': '94.142.136.0/21', 'from': 'MAROSNET Telecommunication Company LLC', 'to': 'NTX Technologies s.r.o.', 'date': '28/06/2019', 'transferType': 'POLICY'}, {'original_block': '185.2.4.0/22', 'transferred_blocks': '185.2.4.0/22', 'from': 'REGISTER.IT S.P.A.', 'to': 'REGISTER S.P.A.', 'date': '01/07/2019', 'transferType': 'MERGER_OR_ACQUISITION'}]
new = ['original_block', 'date']
result = dict([c[i] for i in new] for c in data)
输出:

{'94.142.136.0/21': '28/06/2019', '185.2.4.0/22': '01/07/2019'}
编辑:作为预防措施,可以使用
all
进行检查,以确保缺少的值不会引发
KeyError

dict([c[i] for i in new] for c in data if all(j in c for j in new))


您可以将
json_文件中的子dict映射到
操作符。itemgetter
,其中
new
中的项作为要获取的键,并将生成的2元组序列传递给
dict
构造函数:

from operator import itemgetter
newd = dict(map(itemgetter(*new), json_file))
newd
变为:

{'94.142.136.0/21': '28/06/2019', '185.2.4.0/22': '01/07/2019'}

您可以将
json_文件中的子dict映射到
operator.itemgetter
,将
new
中的项作为要获取的键,并将生成的2元组序列传递给
dict
构造函数:

from operator import itemgetter
newd = dict(map(itemgetter(*new), json_file))
newd
变为:

{'94.142.136.0/21': '28/06/2019', '185.2.4.0/22': '01/07/2019'}


您的
json_文件
变量中有许多DICT。您想要所有DICT的值,还是只想要第一个?我编辑了这个问题,以强调
json_文件
的真实性质。我想要的是所有值,而不是第一个
newd={d['original_block']:d['date']d在我的json}
Steven的帖子很有效。谢谢你的
json\u文件
变量中有很多DICT。你想要所有变量的值,还是只想要第一个?我编辑了这个问题,以强调
json\u文件
的真实性质。我想要所有的值,而不是第一个
newd={d['original\u block']:d['date']d在我的json}
Steven的帖子成功了。谢谢这不是用户希望修复的预期输出,现在应该可以了:)这不是用户希望修复的预期输出,现在应该可以了:)用户想要的内容只能用于两个项目,因为他将第一个项目作为键,第二个项目作为值。用户想要的内容只能用于两个项目,因为他将第一个项目作为键,第二个项目作为值。无需创建和放弃字典,以便在可能的情况下进行更新分配给一个键。这只是不必要地使事情复杂化,没有补偿的好处。当您可以只分配一个键时,不需要创建和丢弃字典来传递更新。这只是不必要地使事情复杂化,没有补偿的好处。回答得好。作为对两个键都不在json中的情况的额外保护,如果i在c中
@agtoever谢谢,请将新的
中的i替换为新的中的i。你的建议很好,我用
all
添加了一个可能的实现。回答得好。作为对两个键都不在json中的情况的额外保护,如果i在c中@agtoever谢谢,请将新的中的i替换为新的中的i。你的建议很好,我用
all
添加了一个可能的实现。