Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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—如何在数字(json)使用json更改时打印名称_Python_Json_For Loop_If Statement - Fatal编程技术网

Python—如何在数字(json)使用json更改时打印名称

Python—如何在数字(json)使用json更改时打印名称,python,json,for-loop,if-statement,Python,Json,For Loop,If Statement,首先,我将展示json: { "name": "LetsTryThis", "grades": [{ "name": "Stack", "pass_grade": 0 }, { "name": "Over", "pass_grade": 0 }, { "name": "flow",

首先,我将展示json:

{
    "name": "LetsTryThis",
    "grades": [{
            "name": "Stack",
            "pass_grade": 0
        },
        {
            "name": "Over",
            "pass_grade": 0
        },
        {
            "name": "flow",
            "pass_grade": 0
        },
        {
            "name": "com",
            "pass_grade": 0
        }
    ]
}
正如你所看到的,每个人都有不同的名字,他们都有一个及格分数,0不及格,1及格

我想做的是,我想做一个比较,在这里我有一个新的json,看起来像:

{
  'name': 'LetsTryThis',
  'grades': [
    {
      'name': 'Stack',
      'pass_grade': 0
    },
    {
      'name': 'Over',
      'pass_grade': 1
    },
    {
      'name': 'flow',
      'pass_grade': 0
    },
    {
      'name': 'com',
      'pass_grade': 0
    }
  ]
}
我想让它在有人经过时打印出名字

我创建了一个代码:

    old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
    new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

   old_list_grades = [i['pass_grade'] for i in old_list['grades']]
问题是我被困在打印所有及格分数的地方,我的想法是,如果旧的和新的名单之间有任何变化,我可能会改变,但后来我意识到,在这种情况下,我将无法打印出姓名


因此,我的问题再次是,当及格分数从0变为1时,我如何能够打印出姓名?

这可能有点冗长,因为我对python不太熟悉

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}
fails = [name['name'] for name in old_list['grades'] if name['pass_grade'] == 0]
now_passes = [name['name'] for name in new_list['grades'] if name['pass_grade'] == 1 and name['name'] in fails ]
print(now_passes)

这可能有点冗长,因为我对python不太熟悉

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}
fails = [name['name'] for name in old_list['grades'] if name['pass_grade'] == 0]
now_passes = [name['name'] for name in new_list['grades'] if name['pass_grade'] == 1 and name['name'] in fails ]
print(now_passes)

您可以尝试创建一个名称和等级的dict,然后进行检查

Ex:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0
输出:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0

您可以尝试创建一个名称和等级的dict,然后进行检查

Ex:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0
输出:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0

创建两个名称列表,其中第一个列表包含失败的旧列表中的名称,第二个列表包含通过的新列表中的名称。然后将列表交叉

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_failed = [ i['name'] for i in old_list['grades'] if i['pass_grade'] == 0] 
new_passed = [ i['name'] for i in new_list['grades'] if i['pass_grade'] == 1] 

change_to_pass = list(set(old_failed) & set(new_passed)) 
print(change_to_pass)
更新:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0
函数
getGradeChangeNames()
将返回等级已更改的所有名称,0->1或从1->0。您可以在循环中调用此函数并传递任何新旧列表

def getGradeChangeNames(old_list,new_list):
    old_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
    new_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}
    changed_grades = [old_name for old_name,old_grade in old_grades.items() if old_grade != new_grades[old_name] ]
    return changed_grades


old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 1}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

getGradeChangeNames(old_list,new_list)

创建两个名称列表,其中第一个列表包含失败的旧列表中的名称,第二个列表包含通过的新列表中的名称。然后将列表交叉

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_failed = [ i['name'] for i in old_list['grades'] if i['pass_grade'] == 0] 
new_passed = [ i['name'] for i in new_list['grades'] if i['pass_grade'] == 1] 

change_to_pass = list(set(old_failed) & set(new_passed)) 
print(change_to_pass)
更新:

old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

old_list_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
new_list_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}

for k, v in old_list_grades.items():
    if v == 0:
        if new_list_grades.get(k) == 1:
            print(k, v)
Over 0
函数
getGradeChangeNames()
将返回等级已更改的所有名称,0->1或从1->0。您可以在循环中调用此函数并传递任何新旧列表

def getGradeChangeNames(old_list,new_list):
    old_grades = {i["name"]: i["pass_grade"] for i in old_list["grades"]}
    new_grades = {i["name"]: i["pass_grade"] for i in new_list["grades"]}
    changed_grades = [old_name for old_name,old_grade in old_grades.items() if old_grade != new_grades[old_name] ]
    return changed_grades


old_list = {'name': 'LetsTryThis',  'grades': [{'name': 'Stack', 'pass_grade': 1}, {'name': 'Over', 'pass_grade': 0},{'name': 'Flow', 'pass_grade': 0},{'name': 'Com', 'pass_grade': 0}]}
new_list = {'name': 'LetsTryThis', 'grades': [{'name': 'Stack', 'pass_grade': 0}, {'name': 'Over', 'pass_grade': 1}, {'name': 'Flow', 'pass_grade': 0}, {'name': 'Com', 'pass_grade': 0}]}

getGradeChangeNames(old_list,new_list)

它不应该说超过1吗?
print(k,new\u list\u grades.get(k))
哦,是的!我意识到另一件事。所以,如果我在一段时间内运行这个选项,那么新列表可以多次更改。是否可以将新列表的值更新为旧列表,以便无论何时进行下一次检查,它都不应该再次打印通过等级1,而是在它变回0时打印?它不应该说超过1吗?
print(k,new\u list\u grades.get(k))
噢,是的!我意识到另一件事。所以,如果我在一段时间内运行这个选项,那么新列表可以多次更改。是否有可能将新的\u列表的值更新为旧的\u列表,以便无论何时进行下一次检查,它都不应该再次打印通过的\u等级1,而是在它变回0时打印?哦,是的!我意识到另一件事。所以,如果我在一段时间内运行这个选项,那么新列表可以多次更改。是否可以将新的\u列表的值更新为旧的\u列表,以便无论何时进行下一次检查,它都不应该再次打印通过的\u等级1,而是在它变回0时打印?这是一个新的要求,与您原来的问题不同。我已经更新了答案。哦,对不起!再次感谢你是救世主!我不太明白你所说的“循环中的函数并传递任何新旧列表”是什么意思。当新的\u列表发生变化时,我们不需要更新旧的\u列表的值吗?当你第一次调用getGradeChangeNames()时,假设你传递了list1和list2,其中list1=旧列表,list2=新列表。当您第二次调用该函数时,您将使用list2=旧列表和list3=新列表进行调用。i、 e.您的新列表在后续通话中变为旧列表。但这取决于你如何管理新旧名单。哦,好吧!我的意思是它确实像你想的那样工作!我只是觉得它根本没有这样做,我很担心,我想如果我只想做0->1,而不关心1->0,但仍然要更新列表,我需要用什么方式从你的循环中继续?哦,是的!我意识到另一件事。所以,如果我在一段时间内运行这个选项,那么新列表可以多次更改。是否可以将新的\u列表的值更新为旧的\u列表,以便无论何时进行下一次检查,它都不应该再次打印通过的\u等级1,而是在它变回0时打印?这是一个新的要求,与您原来的问题不同。我已经更新了答案。哦,对不起!再次感谢你是救世主!我不太明白你所说的“循环中的函数并传递任何新旧列表”是什么意思。当新的\u列表发生变化时,我们不需要更新旧的\u列表的值吗?当你第一次调用getGradeChangeNames()时,假设你传递了list1和list2,其中list1=旧列表,list2=新列表。当您第二次调用该函数时,您将使用list2=旧列表和list3=新列表进行调用。i、 e.您的新列表在后续通话中变为旧列表。但这取决于你如何管理新旧名单。哦,好吧!我的意思是它确实像你想的那样工作!只是我认为它根本没有这样做,我担心它,我假设如果我只想做0->1,而不关心1->0,但仍然要更新列表,我需要用什么方式从循环中继续?