因此,我在这里一直在尝试创建一个脚本,在其中比较两个列表,我将它们称为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?
我希望,我真的希望我对它的描述是正确的,如果有任何问题,请随时发表评论,我会尽力予以答复!
答案 0 :(得分:1)
所以,我想我已经奏效了。让我知道下面的代码如何为您工作。基本上,我注意到您已经提到了一个json
文件,但是您没有使用json
库来读取它。我正在使用json读取文件,因此您很容易dict文件从一开始就可以使用。注意顶部的import json
。我的test.json
是newlist.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
中看到它。