不积跬步无以至千里,不积小流无以成江海

 Administrator     2025-01-30      小工具      476

python实现排课的代码及wps在线使用py

这是excel要实现的效果

python实现代码如下:

def parse_range(s):
    parts = s.split(',')
    numbers = []
    for part in parts:
        if '-' in part:
            start, end = map(int, part.split('-'))
            numbers.extend(range(start, end + 1))
        else:
            numbers.append(int(part))
    return numbers


def format_result(result_list):
    if not result_list:
        return ""
    formatted = []
    start = end = result_list[0]
    for num in result_list[1:]:
        if num == end + 1:
            end = num
        else:
            if start == end:
                formatted.append(str(start))
            else:
                formatted.append(f"{start}-{end}")
            start = end = num
    if start == end:
        formatted.append(str(start))
    else:
        formatted.append(f"{start}-{end}")
    return ','.join(formatted)


input1 = input("请输入学期上课周次(如1-18):")
input2 = input("请输入不可排课周次(如7,10):")
input3 = input("请输入已排入周次(如8,12-14):")
input4 = int(input("请输入剩余总线下学时:"))
input5 = int(input("请输入剩余总学时连上节数:"))

set1 = set(parse_range(input1))
set2 = set(parse_range(input2))
set3 = set(parse_range(input3))

# 计算差集
result_set = set1 - set2 - set3
sorted_result = sorted(result_set)
formatted_result = format_result(sorted_result)

# 计算输出结果个数
count = len(sorted_result)

# 执行新的计算
new_result = input4 - count * input5

print(f"剩余总学时可上周次: {formatted_result}")
print(f"剩余未排学时: {new_result}")

在wps的excel的py编辑器里,

代码如下

df = xl("$B$1:$H$50", headers=True, sheet_name="Sheet1")
def parse_range(s):
    if isinstance(s, int):
        return [s]
    if s == '0' or s == 0:
        return []
    parts = str(s).split(',')
    numbers = []
    for part in parts:
        if '-' in part:
            start, end = map(int, part.split('-'))
            numbers.extend(range(start, end + 1))
        else:
            numbers.append(int(part))
    return numbers

def format_result(result_list):
    if not result_list:
        return ""
    formatted = []
    start = end = result_list[0]
    for num in result_list[1:]:
        if num == end + 1:
            end = num
        else:
            if start == end:
                formatted.append(str(start))
            else:
                formatted.append(f"{start}-{end}")
            start = end = num
    if start == end:
        formatted.append(str(start))
    else:
        formatted.append(f"{start}-{end}")
    return ','.join(formatted)

for i in range(30):
  input1 = df.iloc[i,0]
  input2 = df.iloc[i,1]
  input3 = df.iloc[i,2]
  input4 = int(df.iloc[i,3])
  input5 = int(df.iloc[i,4])
  
  set1 = set(parse_range(input1))
  set2 = set(parse_range(input2))
  set3 = set(parse_range(input3))

  # # # # 计算差集
  result_set = set1 - set2 - set3
  sorted_result = sorted(result_set)
  formatted_result = format_result(sorted_result)

  # # # # 计算输出结果个数
  count = len(sorted_result)

  # # # # 执行新的计算
  if (input5 != 8) :
    new_result = input4 - count * input5
    print(formatted_result)
    print(new_result)
    # # # # 假设使用write_xl函数将结果写入对应单元格
    # # # # 这里为模拟,实际使用时需要替换为真实的write_xl函数调用
    # # # # 写入g的结果
    # # # # write_xl(formatted_result, range="g"+str(i))
    # # # # write_xl(new_result, range="h"+str(i))
    write_xl(formatted_result, range="g"+str(i+2))
    write_xl(new_result, range="h"+str(i+2))
  else:
    write_xl("1-5", range="g"+str(i+2))
    write_xl(0, range="h"+str(i+2))