所以在收到带有以下代码的 JSON 后:
ctype, pdict = cgi.parse_header(self.headers.get('content-type'))
if ctype == 'application/JSON':
length = int(self.headers.get('content-length'))
input = JSON.loads(self.rfile.read(length))
我从 print(input) 收到了这种 JSON,它是一个字典:
{'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0],
'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0],
'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0],
'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0],
'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0],
'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}
正如我们所见,JSON 中的每个“列表”都有一个“数组”。如何将它们提取到单独的 python 列表变量中?
例如:
dog = []
cat = []
bird = []
chicken = []
我一直在研究解决方案,范围从使用 for
循环到模块导入。我相信有一个更简单的解决方案来提取这个。
你能分享一个想法吗?
答案 0 :(得分:0)
就像您提到的问题的评论一样,您已经有一本字典,这可能是正确的数据结构。但是,如果您需要从 dict 中提取一堆东西作为单独的项目,operator.itemgetter
是一种方便、易读的方法:
from operator import itemgetter
jsn = {'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0], 'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0], 'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0], 'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0], 'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0], 'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}
dog,cat,bird,chicken = itemgetter('dog','cat','bird','chicken')(jsn['packageInput'])
另一方面,如果您正在寻找一种动态方式来执行此操作 - 在拥有 json 之前您不知道将创建哪些变量 - 这是一个错误。它只是不起作用——毕竟你需要知道变量名以后才能在程序中使用它们。如果 print(cat)
不在 json 中,则稍后在程序中使用 "cat"
会崩溃。字典可以让你处理这个问题。
答案 1 :(得分:0)
exec 正是您所需要的,但您应该不惜任何代价避免使用它。参考this。
d = {'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0], 'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0], 'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0], 'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0], 'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0], 'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}
obj = d.get('packageInput')
for k in obj.keys():
exec(f"{k} = {obj.get(k)}")
print(dog)
#[4.18, 0.08, 41.51, 0, 0, 0, 0, 0]
推荐的解决方案, 将它用作已经是的字典。
dog = obj.get('dog')