鱼C论坛

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

求助2024020100~

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

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

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

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

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

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

           def record_validation_rules()

                   ........

            return sheet_validations





回复请注意python格式~~

  
前车之鉴是啥意思?

我上了反面教材了?




本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

    return rows, cols

rule_str = '3+5+6=7+16+31+38'
rows, cols = extract_rules(rule_str)
print(rows)  # 输出:['3', '5', '6']
print(cols)  # 输出:['7', '16', '31', '38']

2.2.1 对于行验证,我们可以通过在循环中逐一计算每一行的验证结果,然后将结果与规则中的值进行比较,进而判断是否满足验证规则。下面是一个示例代码:
def validate_rows(sheet_validations, sheet_data):
    for sheet_name, validations in sheet_validations.items():
        rows = validations['rows']
        cols = validations['cols']
        
        # 遍历每一个要验证的行
        for row_nums in rows:
            # 获取每个行号对应的列值
            for col_num in cols[0]:
                # 计算规则中每一行的值
                row_values = []
                for num in row_nums:
                    row_values.append(sheet_data[sheet_name][num-1][col_num])
                # 比较计算结果与规则中的值是否相等
                if sum(row_values) != sheet_data[sheet_name][row_nums[-1]-1][col_num]:
                    print(f"验证失败:第{row_nums[-1]}行的{chr(ord('A')+col_num-1)}列的值不满足规则")

2.2.2 对于列验证,我们可以使用类似的方法来进行计算和比较。下面是一个示例代码:
def validate_cols(sheet_validations, sheet_data):
    for sheet_name, validations in sheet_validations.items():
        rows = validations['rows']
        cols = validations['cols']
        
        # 遍历每一个要验证的列
        for col_nums in cols:
            # 获取每个列号对应的行值
            for row_num in rows[0]:
                # 计算规则中每一列的值
                col_values = []
                for num in col_nums:
                    col_values.append(sheet_data[sheet_name][row_num-1][num])
                # 比较计算结果与规则中的值是否相等
                if sum(col_values) != sheet_data[sheet_name][row_num-1][col_nums[-1]]:
                    print(f"验证失败:第{row_num}行的{chr(ord('A')+col_nums[-1]-1)}列的值不满足规则")

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,等我慢慢理解一下再来回复~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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”这样的验证规则,我们需要将其分解成左边和右边的两个部分,再进一步分解成单独的数字或字母。这可以通过字符串分割和映射实现。

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

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

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

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

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

# 示例
print(parse_validation_rule("3+5+6=7+16+31+38"))
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”为例的伪代码:

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

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

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

    return left_sum == right_sum

# 示例调用
# validate_row(sheet, "6=7+16+31+38")

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

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

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

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

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

    return left_sum == right_sum

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

谢谢   待我测试后来回复~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


我新手,暂时只能够设想可能的情形,写不出程序,见谅~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


应该不会吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 03:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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