比较两个列表,并在发生更改时打印出来

时间:2018-12-10 21:40:01

标签: python list for-loop compare

因此,我在这里一直在尝试创建一个脚本,在其中比较两个列表,我将它们称为old_list和new_list。 Old_list是我在While True之前使用的变量。在While true内部,我使用了new_list ([line.rstrip('\n') for line in open('newlist.txt')]。然后我的想法是将old_list与new_list进行比较。

我有一个Json(新列表),看起来像:

{
    "name": "LetsTryThis",
    "grades": [{
            "name": "Stack",
            "pass_grade": 0
        },
        {
            "name": "Over",
            "pass_grade": 0
        },
        {
            "name": "flow",
            "pass_grade": 0
        },
        {
            "name": "com",
            "pass_grade": 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 = [line.rstrip('\n') for line in open('newlist.txt')]#For be able to test it you can just copy the same value as old_list and just change the values of pass_grades to 1

    while True:
    test = getGradeChangeNames(old_list, new_list)
    if test != []:
        print("New item found - " + ", ".join(test))
        old_list = new_list
        print(old_list)
    else:
        print("sleep")
        time.sleep(2)

函数getGradeChangeNames()将返回所有已更改坡度的名称,范围是0-> 1或从1-> 0。

但是我想要我的脚本做什么:

我想创建一个脚本,在脚本中检查值何时更改0-> 1和1->0。但是我希望它仅在0-> 1发生时打印出来(打印出“名称”)而不显示当1-> 0发生时。但是,如您所见,我有一个sleep(2),发生的事情是我可以将json值newlist.txt等更改为:

{
    "name": "LetsTryThis",
    "grades": [{
            "name": "Stack",
            "pass_grade": 0
        },
        {
            "name": "Over",
            "pass_grade": 0
        },
        {
            "name": "flow",
            "pass_grade": 1
        },
        {
            "name": "com",
            "pass_grade": 1
        }
    ]
}

,在这种情况下,它应该ping'Over'和'com',在下一个循环搜索中,它不再应该ping。如果pass_grade从1变为0,则应更新该值而不打印输出,这意味着每当它再次从0变为1时,都应再次打印输出。

我的问题是: 我如何只能打印一次从0-> 1更改的所有值,如果值从1更改则如何更新该值-> 0?

我希望,我真的希望我对它的描述是正确的,如果有任何问题,请随时发表评论,我会尽力予以答复!

1 个答案:

答案 0 :(得分:1)

所以,我想我已经奏效了。让我知道下面的代码如何为您工作。基本上,我注意到您已经提到了一个json文件,但是您没有使用json库来读取它。我正在使用json读取文件,因此您很容易dict文件从一开始就可以使用。注意顶部的import json。我的test.jsonnewlist.txt文件,因此只需更改名称即可。

import json
import time

 def getGradeChangeNames(old_list, new_list):
      old_grades = {i["name"].lower(): i["pass_grade"] for i in old_list["grades"]}
      new_grades = {i["name"].lower(): 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 == 0 and new_grades[old_name] == 1 ] 
      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}]}

 while True:
     with open('test.json') as f:
         new_list = json.load(f)

     test = getGradeChangeNames(old_list, new_list)
     old_list = new_list

     if test != []: 
         print("New item found - " + ", ".join(test))

     else:
         print("sleep")
         time.sleep(2)

我相信我前面提到的条件语句是必需的。让我知道这对您如何工作。我得到了想要的输出:1 -> 0的输出将忽略0 -> 1的更改。

此外,我注意到的一件事是name中的old_list字段与newlist.txt内部的字段之间的断开;为了解决这个问题,我使用字符串的.lower()方法将所有名称都转换为小写。您可以在getGradeChangeNames中看到它。