所以我一直在尝试创建一个脚本,在这个脚本中,我比较两个列表,并将它们称为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发生时。然而,正如你所看到的,我有一个睡眠(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"one_answers"com",在下一个循环搜索中,它不应该再ping了。如果pass_grade从1变为0,它应该在不打印的情况下更新值,这意味着无论何时再次从0变为1,它都应该再次打印出来。
我的问题是:如何才能只打印一次从0->1更改的所有值,并在值从1->0更改时更新值?
我希望,我真的希望我描述的是正确的,如果有任何问题,请随时发表评论,我会尽力回答!
所以,我想我已经让它工作了。让我知道下面的代码是如何为您工作的。基本上,我注意到您有一个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
输出名称。
此外,我注意到的一件主要事情是old_list
中的name
字段和newlist.txt
中的字段之间的断开;为了解决这个问题,我使用字符串的.lower()
方法将所有名称都变成小写。您可以在getGradeChangeNames
中看到这一点。