首页 > 编程问答 >Python函数获取匹配和错误记录

Python函数获取匹配和错误记录

时间:2024-07-24 09:49:03浏览次数:11  
标签:python

我有一个以下格式的json文件:

[
    {
        "type": "BEGIN",
        "id": "XYZ123"
    },
    {
        "type": "END",
        "id": "XYZ123",
    },
    {
        "type": "BEGIN",
        "id": "XYZ456"
    },
    {
        "type": "END",
        "id": "XYZ987"
    },
    {
        "type": "END",
        "id": "XYZ456"
    },
    {
        "type": "BEGIN",
        "id": "XYZ789"
    },
    {
        "type": "",
        "id": "XYZ345"
    }

]

我需要输出2个文件:

valid_records.lst:

    "id": "XYZ123"
    "id": "XYZ456"

error_records.lst:

    "id": "XYZ987"
    "id": "XYZ789"
    "id": "XYZ345"

即,BEGIN和END类型的块都是有效的。类型为 BEGIN 或 END 或没有的块都是错误。

这是我到目前为止尝试过的代码片段:`

valid_records=[]    
error_records=[]
        for rec in records:
            if rec.get("type") == "BEGIN":
                for rec1 in records:

                    if rec['id'] == rec1['id'] and rec1.get("type") == "END":
                        valid_records.append(rec1)
                         print("valid id : ", rec1['id'])

                    elif rec['id'] == rec1['id'] and rec1.get("type") != "END":
                        print("ignore, duplicate")
                    else:
                        error_records.append(rec1)
                        print("error id : ", rec1['id'])

这会正确打印有效的 ID(同时具有 BEGIN 和 END 的 ID)。但是,当生成错误记录时,它还包括之前识别为有效的 ID。另外,我不知道如何编码来捕获那些只有 BEGIN、END 或没有的 id。


你可以使用一个栈来跟踪已经开始但尚未结束的ID。然后,你可以遍历记录,并根据每个记录的类型和栈的状态,相应地填充有效记录和错误记录列表。

import json

def validate_records(records):
  """
  验证记录并返回有效和错误的ID列表。

  Args:
    records: 记录列表。

  Returns:
    一个包含有效记录列表和错误记录列表的元组。
  """
  valid_records = []
  error_records = []
  stack = []

  for record in records:
    record_type = record.get("type")
    record_id = record.get("id")

    if record_type == "BEGIN":
      stack.append(record_id)  # 开始新的块,将ID推送到栈上
    elif record_type == "END":
      if stack and stack[-1] == record_id:
        stack.pop()  # 匹配的结束,从栈上弹出ID
        valid_records.append(record_id)
      else:
        error_records.append(record_id)  # 不匹配的结束
    else:
      error_records.append(record_id)  # 无效类型

  # 添加栈中剩余的任何ID到错误记录中(未封闭的BEGIN块)
  error_records.extend(stack)

  return valid_records, error_records

# 从文件加载记录
with open("your_file.json", "r") as f:
  records = json.load(f)

# 验证记录
valid_records, error_records = validate_records(records)

# 打印结果
print("valid_records:", valid_records)
print("error_records:", error_records)

# 将结果保存到文件
with open("valid_records.lst", "w") as f:
  for record_id in valid_records:
    f.write(f"    \"id\": \"{record_id}\"\n")

with open("error_records.lst", "w") as f:
  for record_id in error_records:
    f.write(f"    \"id\": \"{record_id}\"\n")

这段代码首先初始化两个列表: valid_records error_records ,以及一个空栈 stack 。然后,它循环遍历记录列表。对于每个记录,它检查其类型:

  • 如果类型是“BEGIN”,则将ID推送到栈上。
  • 如果类型是“END”,则检查栈是否为空以及栈顶元素是否与记录的ID匹配。如果是,则从栈中弹出该ID并将记录的ID添加到 valid_records 列表中。否则,将记录的ID添加到 error_records 列表中。
  • 如果类型既不是“BEGIN”也不是“END”,则将记录的ID添加到 error_records 列表中。

最后,循环结束后,如果栈中还有任何元素,则将它们添加到 error_records 列表中。这可以确保所有未封闭的“BEGIN”块都被视为错误。

标签:python
From: 78746747

相关文章

  • python,替换标点符号但保持特殊单词完整的最佳方法
    我正在制作一个调制函数,它将采用带有特殊字符(@&*%)的关键字,并保持它们完整,同时从句子中删除所有其他标点符号。我设计了一个解决方案,但它非常庞大,而且可能比需要的更复杂。有没有一种方法可以以更简单的方式做到这一点。简而言之,我的代码匹配特殊单词的所有实例以查找跨度。然......
  • Python 检测 USB 设备 - IDLE 和 CMD 解释器之间的不同结果
    我正在尝试解决VDI解决方案中智能卡设备的USB重定向问题。我正在使用pyscard模块作为智能卡。对于进一步的上下文,主要问题是当浏览器插件调用用于处理智能卡的python脚本时,未检测到读卡器。关于问题,当我从CMD解释器运行此代码片段时,我收到空列表,表示系统上未找......
  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......