【问题标题】:How to group dictionary elements into lists dynamically?如何将字典元素动态分组到列表中?
【发布时间】:2019-05-03 10:51:50
【问题描述】:
I have JSON file as mentioned below,
**test.json**

    {
    "header1" :
       {
           "header1_body1":
              {
               "some_key":"some_value",
                .......................
              },
          "header1_body2":
              {
                "some_key":"some_value",
                 .......................
              }

       },
    "header2":
       {
          "header2_body1":
              {
               "some_key":"some_value",
                .......................
              },
          "header2_body2":
              {
                "some_key":"some_value",
                 .......................
              }
    }
}

希望将 JSON 内容分组到如下列表中:

header1 = ['header1_body1','header1_body2']
header2 = ['header2_body1','header2_body2']

header1, header2 can be till ....header n。因此,必须创建包含其值的动态列表,如上所示。

我怎样才能做到这一点? 最佳的接近方法是什么?

解决方案:

with open('test.json') as json_data:
      d = json.load(json_data)

for k,v in d.iteritems():
      if k == "header1" or k == "header2":
            globals()['{}'.format(k)] = d[k].keys()

现在,header1header2 可以作为列表访问。

for i in header1:
    print i

【问题讨论】:

  • 首先,确保你的 json 格式正确,因为我看到你写了错误的 json 格式,它应该是"header1_body2":{ ... }
  • 了解filtersorted
  • @ImamDigmi 抱歉,这是错字。感谢提及。

标签: python json list dictionary group-by


【解决方案1】:

假设您将 JSON 读入变量 d(可能使用 json.loads),您可以遍历键(排序?)并使用当前值的键构建列表:

for key in sorted(d.keys()):
    l = [x for x in sorted(d[key].keys())]  # using list comprehension
    print(key + ' = ' + str(l))

【讨论】:

  • 我认为这很困难,因为他也想创建一个动态列表和变量名称,但是如果他想从字典中获取值,那么可以制作一个二维列表
【解决方案2】:

修复你的 json 结构:

{
"header1" :
   {
       "header1_body1":
          {
           "some_key":"some_value"
          },
      "header1_body2":
          {
            "some_key":"some_value"
          }

   },
"header2":
    {
      "header2_body1":
          {
           "some_key":"some_value"
          },
      "header2_body2":
          {
            "some_key":"some_value"
          }
    }
}

然后加载和创建列表:

header = []

for key, value in dictdump.items():

    header.append(list(value.keys()))

for header_num in range(0, len(header)):
    print("header{} : {}".format(header_num + 1, header[header_num]))

给予:

header1 : ['header1_body1', 'header1_body2']
header2 : ['header2_body1', 'header2_body2']

【讨论】:

    【解决方案3】:

    加载 json 后,您可以通过执行以下操作获取任何键的列表(下面的headers 变量是加载的 json 的占位符)。您无需将其转换为列表即可将其作为可迭代对象使用,而是将其包装在 list(...) 中以匹配您问题中的输出。

    list(headers['header1'].keys())
    

    如果您需要以某种可访问的格式实际存储每个“标题”字典的键列表,那么您可以创建另一个包含所需列表的字典。例如:

    import json
    
    data = """{
        "header1" : {
            "header1_body1": {
                 "some_key":"some_value"
                 },
            "header1_body2": {
                "some_key":"some_value"
                }
            },
        "header2": {
            "header2_body1": {
                "some_key":"some_value"
                },
            "header2_body2": {
                "some_key":"some_value"
                }
            }
        }"""
    
    headers = json.loads(data)
    
    # get the list of keys for a specific header
    header = list(headers['header1'].keys())
    print(header)
    # ['header1_body1', 'header1_body2']
    
    # if you really want to store them in another dict
    results = {h[0]: list(h[1].keys()) for h in headers.items()}
    print(results)
    # OUTPUT
    # {'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}
    

    【讨论】:

      【解决方案4】:

      你可以使用递归:

      d = {'header1': {'header1_body1': {'some_key': 'some_value'}, 'header1_body2': {'some_key': 'some_value'}}, 'header2': {'header2_body1': {'some_key': 'some_value'}, 'header2_body2': {'some_key': 'some_value'}}}
      def flatten(_d):
        for a, b in _d.items():
          yield a
          if isinstance(b, dict):
            yield from flatten(b)
      
      new_results = {a:[i for i in flatten(b) if i.startswith(a)] for a, b in d.items()}
      

      输出:

      {'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}
      

      【讨论】:

        【解决方案5】:
        import json
        with open('test.json') as json_data:
                  d = json.load(json_data)
        
        for k,v in d.iteritems():
            if k == "header1" or k == "header2":
                  globals()['{}'.format(k)] = d[k].keys()
        
        now, `header1` and `header2` can be accessed as list.
        
            for i in header1:
                print i
        

        【讨论】:

        • 使用 globals() 对吗?或任何其他替代全局变量?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多