鱼C论坛

 找回密码
 立即注册
查看: 1663|回复: 7

求助2024020100~

[复制链接]
发表于 2024-2-1 16:37:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 清風 于 2024-2-1 21:52 编辑

不晓得为什么我之前发的帖子不见了........

1.首先我已经 定义了如下函数(请注意我的文件是xls):

           def record_validation_rules()

                   ........

            return sheet_validations





回复请注意python格式~~

  
前车之鉴是啥意思?

我上了反面教材了?




本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-1 16:38:47 | 显示全部楼层
1. 关于你之前发的帖子不见了的问题,可能是因为网络或者系统故障导致帖子被删除了。不过不用担心,你可以重新提问,我会尽力帮助你解决问题。

2.1 对于用户以“3+5+6=7+16+31+38”的方式录入多条行验证规则,我们可以使用正则表达式来识别并提取出其中的行号和列号。下面是一个简单的示例代码:

  1. import re

  2. def extract_rules(rule_str):
  3.     # 提取行号和列号,并将它们存储到一个列表中
  4.     rows = re.findall(r'[0-9]+', rule_str)
  5.     cols = re.findall(r'[A-Z]+', rule_str)

  6.     return rows, cols

  7. rule_str = '3+5+6=7+16+31+38'
  8. rows, cols = extract_rules(rule_str)
  9. print(rows)  # 输出:['3', '5', '6']
  10. print(cols)  # 输出:['7', '16', '31', '38']
复制代码


2.2.1 对于行验证,我们可以通过在循环中逐一计算每一行的验证结果,然后将结果与规则中的值进行比较,进而判断是否满足验证规则。下面是一个示例代码:

  1. def validate_rows(sheet_validations, sheet_data):
  2.     for sheet_name, validations in sheet_validations.items():
  3.         rows = validations['rows']
  4.         cols = validations['cols']
  5.         
  6.         # 遍历每一个要验证的行
  7.         for row_nums in rows:
  8.             # 获取每个行号对应的列值
  9.             for col_num in cols[0]:
  10.                 # 计算规则中每一行的值
  11.                 row_values = []
  12.                 for num in row_nums:
  13.                     row_values.append(sheet_data[sheet_name][num-1][col_num])
  14.                 # 比较计算结果与规则中的值是否相等
  15.                 if sum(row_values) != sheet_data[sheet_name][row_nums[-1]-1][col_num]:
  16.                     print(f"验证失败:第{row_nums[-1]}行的{chr(ord('A')+col_num-1)}列的值不满足规则")
复制代码


2.2.2 对于列验证,我们可以使用类似的方法来进行计算和比较。下面是一个示例代码:

  1. def validate_cols(sheet_validations, sheet_data):
  2.     for sheet_name, validations in sheet_validations.items():
  3.         rows = validations['rows']
  4.         cols = validations['cols']
  5.         
  6.         # 遍历每一个要验证的列
  7.         for col_nums in cols:
  8.             # 获取每个列号对应的行值
  9.             for row_num in rows[0]:
  10.                 # 计算规则中每一列的值
  11.                 col_values = []
  12.                 for num in col_nums:
  13.                     col_values.append(sheet_data[sheet_name][row_num-1][num])
  14.                 # 比较计算结果与规则中的值是否相等
  15.                 if sum(col_values) != sheet_data[sheet_name][row_num-1][col_nums[-1]]:
  16.                     print(f"验证失败:第{row_num}行的{chr(ord('A')+col_nums[-1]-1)}列的值不满足规则")
复制代码


希望能解决你的问题!如果还有其他疑问,请继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-1 16:45:49 | 显示全部楼层
FishC 发表于 2024-2-1 16:38
1. 关于你之前发的帖子不见了的问题,可能是因为网络或者系统故障导致帖子被删除了。不过不用担心,你可以 ...

谢谢,等我慢慢理解一下再来回复~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-1 16:46:11 | 显示全部楼层
清風 发表于 2024-02-01 16:45
谢谢,等我慢慢理解一下再来回复~


不用客气,慢慢理解,并随时提问都没问题。如果有任何进一步的问题,请随时向我提问。我会尽力帮助你。祝你学习愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-1 16:47:03 | 显示全部楼层
楼上的确定的能运行吗?

2.1 多条行/列验证规则的识别和存储
对于用户输入的形如“3+5+6=7+16+31+38”或者“M+N+O+P+Q+R=S+T+U+V+W+X+Y”这样的验证规则,我们需要将其分解成左边和右边的两个部分,再进一步分解成单独的数字或字母。这可以通过字符串分割和映射实现。

以下是一个处理这种规则的示例函数:


  1. def parse_validation_rule(rule):
  2.     # 分割等号两侧
  3.     left_side, right_side = rule.split('=')

  4.     # 分割左侧和右侧的元素
  5.     left_elements = left_side.split('+')
  6.     right_elements = right_side.split('+')

  7.     # 将字母转换为列号,数字保持不变
  8.     def convert(element):
  9.         if element.isalpha():
  10.             # 将列字母转换为列号(例如A -> 0, B -> 1)
  11.             return ord(element.upper()) - ord('A')
  12.         else:
  13.             # 将字符串数字转换为整数
  14.             return int(element) - 1  # 减1是因为Excel行列是从1开始的

  15.     return [list(map(convert, left_elements)), list(map(convert, right_elements))]

  16. # 示例
  17. print(parse_validation_rule("3+5+6=7+16+31+38"))
  18. print(parse_validation_rule("M+N+O+P+Q+R=S+T+U+V+W+X+Y"))
复制代码

2. 应用验证规则到Excel表格
2.2.1 行验证
对于行验证,我们需要按照用户的规则,计算行中所有单元格的值,并进行比较。这涉及到对Excel表格的逐行读取和数值计算。

以“6=7+16+31+38”为例的伪代码:


  1. def validate_row(sheet, rule):
  2.     left_rows, right_rows = parse_validation_rule(rule)

  3.     # 计算左侧总和
  4.     left_sum = sum([sum(sheet.row_values(row)) for row in left_rows])

  5.     # 计算右侧总和
  6.     right_sum = sum([sum(sheet.row_values(row)) for row in right_rows])

  7.     return left_sum == right_sum

  8. # 示例调用
  9. # validate_row(sheet, "6=7+16+31+38")
复制代码


请注意伪代码并不能直接运行,还请楼主自行脑补,不要依赖回答。
2.2.2 列验证
列验证与行验证类似,只是方向改为垂直方向。

以“E=F+G+H+I”为例的伪代码:


  1. def validate_column(sheet, rule):
  2.     left_cols, right_cols = parse_validation_rule(rule)

  3.     # 计算左侧总和
  4.     left_sum = sum([sum(sheet.col_values(col)) for col in left_cols])

  5.     # 计算右侧总和
  6.     right_sum = sum([sum(sheet.col_values(col)) for col in right_cols])

  7.     return left_sum == right_sum

  8. # 示例调用
  9. # validate_column(sheet, "E=F+G+H+I")
复制代码

注意,这里的代码只是一个基本框架,具体实现需要根据你的实际需求和你使用的Excel处理库(如openpyxl或xlrd)进行调整。同时,请确保在实际应用中对各种可能的输入进行适当的错误处理和验证。

求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-1 16:53:26 | 显示全部楼层
sfqxx 发表于 2024-2-1 16:47
楼上的确定的能运行吗?

2.1 多条行/列验证规则的识别和存储

谢谢   待我测试后来回复~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-1 17:13:45 | 显示全部楼层
sfqxx 发表于 2024-2-1 16:47
楼上的确定的能运行吗?

2.1 多条行/列验证规则的识别和存储

那请问第2.1问题要不要先判断一下左边部分是否有+号呢?
如果没有,左边也按+号分割会报错吗?


我新手,暂时只能够设想可能的情形,写不出程序,见谅~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-1 20:37:09 | 显示全部楼层
清風 发表于 2024-2-1 17:13
那请问第2.1问题要不要先判断一下左边部分是否有+号呢?
如果没有,左边也按+号分割会报错吗?


应该不会吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表