Сравните два списка и распечатайте, когда произойдет изменение - PullRequest
0 голосов
/ 11 декабря 2018

Итак, я пытался создать сценарий, в котором я сравниваю два списка, где я называю их old_list и new_list.Old_list - это переменная, в которой я использую до того, как True.И в то время как истина, где я использую new_list ([line.rstrip('\n') for line in open('newlist.txt')].Тогда моей идеей было сделать сравнение old_list с new_list.

У меня есть Json (newlist), который выглядит следующим образом:

{
    "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
        }
    ]
}

, и в этом случае оно должно пропинговать 'Over' и'com' и при поиске следующего цикла он больше не должен пинговать.Если pass_grade изменяется от 1 до 0, он должен обновлять значение, не выводя значения, всякий раз, когда он снова нажимает 0 к 1, он должен распечатывать снова.

Мой вопрос: Как я могу быть в состоянии распечатать все значения, которые изменяются от 0-> 1 только один раз, и обновить значение, если значение меняется с 1 -> 0?

Я надеюсь, я действительно надеюсь, что я описалПравильно, и если есть вопросы, не стесняйтесь комментировать, и я сделаю все возможное, чтобы ответить!

1 Ответ

0 голосов
/ 11 декабря 2018

Итак, я думаю, у меня это работает.Дайте мне знать, как работает код ниже для вас.По сути, я заметил, что у вас есть файл 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...