【问题标题】:Best way to process JSON into separate lists? [duplicate]将 JSON 处理成单独列表的最佳方法? [复制]
【发布时间】:2021-08-01 13:56:42
【问题描述】:

所以在收到带有以下代码的 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 循环到模块导入。我相信有一个更简单的解决方案来提取它。

你能分享一个想法吗?

【问题讨论】:

  • 动态命名变量通常是个坏主意。你已经有一些非常接近的东西,这要好得多。通过variables = data['packageInput'],您可以以data['dog']data['cat'] 等身份访问每个列表...

标签: python json python-3.x


【解决方案1】:

就像您提到的问题中的 cmets 一样,您已经有一本字典,这可能是正确的数据结构。但是,如果您需要从 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 之前你不知道会创建哪些变量——这是一个错误。它只是行不通——毕竟你需要知道变量名以后才能在程序中使用它们。如果 "cat" 不在 json 中,则稍后在程序中使用 print(cat) 会崩溃。字典可以让你处理这个问题。

【讨论】:

    【解决方案2】:

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多