【问题标题】:Compare two lists and print out when a change happens比较两个列表并在发生更改时打印出来
【发布时间】:2018-12-10 21:40:01
【问题描述】:

所以我在这里一直在尝试创建一个脚本,在其中比较两个列表,我称之为 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?

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

【问题讨论】:

  • 您可以编辑您的帖子以在标题和/或正文中包含您的实际问题吗?
  • @RandomDavis 将在帖子底部立即执行此操作!感谢您对此发表评论!

标签: python list for-loop compare


【解决方案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 输出名称。

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

【讨论】:

  • 这可能是问题所在。我还没有找到正确的方法,我认为这是我真正陷入的问题:(
  • 我错了。我认为这里有几个问题。我正在修复它们,完成后会编辑我的帖子。
  • 哇!这真太了不起了!我想我确实发现了一个错误!所以基本上如果你将 etc“Over”更改为 1。它会通知正确。如果你把它改回0。它不会通知哪个也很好,但是如果你把它改回1,它不会因为某种原因通知? - 你可以做的一个测试是你把所有的都变成1。当它通知发生了什么变化时。全部转回 0,然后再转回 1。
  • 哎呀,我错过了那个测试用例。接得好!我已经更新了我的答案。基本上将更新语句 -> old_list = new_list 移到 if 语句之外,因为您希望跟踪 ALL 更改,而不仅仅是当我们注意到 0 -> 1 的更改时。现在,每次您为我更改它时它都会起作用。
  • 不错!是的,将它添加到else 应该也可以。听起来不错。没问题。很高兴为您提供帮助!
猜你喜欢
  • 2023-02-25
  • 1970-01-01
  • 2013-04-25
  • 2019-05-15
  • 1970-01-01
  • 2016-01-01
  • 2020-12-13
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多