追加一个重新排列的json.values(),如果为空,则将其作为空列表

时间:2018-07-30 04:56:14

标签: python json dictionary

我希望检查出现的总数“ id”(在这种情况下为12个“ id”),然后创建一个空列表,以按照“ item_id”的顺序附加“ item_task”。

示例:1:播放,2:给予,3:给予,4:检查......... 12:很好(已完成)

由于没有列出编号6的“ item_id”,因此我想为其分配一个空列表。 “ item_id” ---> 6:[] ....我希望它自动检查json中不包含哪些“ item_id”。在此示例中,我给出6,但有时5或12不在其中。有办法吗?

下面是我的json文件。

json =

[ {
  "testing" : [ {
    "example" : {
    },
    "get" : [ {
      "id" : "0",
      "item" : [ {
        "get_id" : "1",
        "item_task" : "play"
      } ]
    }, {
      "id" : "1",
      "item" : [ ],
    } ]
  }, {
    "example" : {

    },
    "get" : [ {
      "id" : "2",
      "item" : [ ],
    } ]
  }, {
    "example" : {

      } ]
    },
    "get" : [ {
      "id" : "3",
      "item" : [ {
        "item_id" : "2",
        "item_task" : "give"
      } ],
    } ]
  }, {
    "example" : {

    },
    "get" : [ {
      "id" : "4",
      "item" : [ {
        "item_id" : "5",
        "item_task" : "play"
      } ],
    }, {
      "id" : "5"
    } ]
  }, {
    "example" : {

    },
    "get" : [ {
      "id" : "6",
      "item" : [ {
        "item_id" : "0",
        "item_task" : "let"
      }, {
        "item_id" : "3",
        "item_task" : "give"
      }, {
        "item_id" : "4",
        "item_task" : "check"
      }, {
        "item_id" : "7",
        "item_task" : "nice"
      }, {
        "item_id" : "8",
        "item_task" : "nice"
      }, {
        "item_id" : "9",
        "item_task" : "do"
      } ]
    }, {
      "id" : "7",
    }, {
      "id" : "8",
    }, {
      "id" : "9"
    } ]
  }, {
    "example" : {

    },
    "get" : [ {
      "id" : "10",
      "item" : [ {
        "item_id" : "11",
        "item_task" : "nice"
      }, {
        "item_id" : "12",
        "item_task" : "nice"
      } ]
    }, {
      "id" : "11",
    }, {
      "id" : "12"
    } ]
  } ]
} ]

我对(1)的代码计算'id'的数量。 (2)找到'id'和'item_id'之间的区别(3)向不在json文件中的'item_id'添加一个空列表。

count = 0
for test in u[0]['testing']:
    for value in test["get"]:
        if "id" in valu:
            count += 1


value = []
for test in u[0]["testing"]:
    for value in test["get"]:
        if 'item' in value:
            for u in value["item"]:
                for i in range(count):
                    if str(i) not in u["item_id"]:
                        print(str(i)) 

但是我没有得到json文件中没有的'item_id'。你能帮我吗

1 个答案:

答案 0 :(得分:1)

您还没走那么远,但是我不得不修复您的初始u,因为它包含语法错误和一个"get_id"键,该键当然应该显示为"item_id"

应该怎么做?

在两个循环中,您应始终将项目添加到适当的容器中:ID列表和item_tasks字典。并且,请切勿重复使用变量名

for u in value["item"]:

完全是错误的,因为它会覆盖名为... u 的主结构。

代码可能是:

count = 0
ids = []
for test in u[0]['testing']:
    for value in test["get"]:
        if "id" in value:
            ids.append(value["id"])
            count += 1

task = {}
del tasks
for test in u[0]["testing"]:
    for value in test["get"]:
        if 'item' in value:
            for x in value["item"]:
                if x['item_id'] in ids:
                    task[x['item_id']] = x['item_task']

好吧,您分别拥有ID和任务。然后,您可以使用以下命令构建有序的字典:

import collections
resul = collections.OrderedDict()
for i in ids:
    resul[i] = task.get(i, [])

print(resul)
OrderedDict([('0', 'let'), ('1', 'play'), ('2', 'give'), ('3', 'give'), ('4', 'check'), ('5', 'play'), ('6', []), ('7', 'nice'), ('8', 'nice'), ('9', 'do'), ('10', []), ('11', 'nice'), ('12', 'nice')])

因为没有为6和10分配任务。