Python 3实现双数值列表校验及皮尔逊相关系数计算
问题需求
- 实现Python 3程序,完成以下功能:
- 校验用户输入的两个数值列表,确保仅包含数值(支持整数、小数、负数)
- 输入允许元素前后有额外空格,数值间必须用逗号分隔
- 若列表包含非数值元素,输出提示
was not able to calculate the correlation并终止程序 - 不使用第三方库或高级函数,代码简洁
- 若校验通过,计算并输出皮尔逊相关系数(保留两位小数,如示例输出的0.83)
现有代码的问题
用户尝试的代码中,使用ele.isdigit()判断元素是否为数值,该方法仅能识别正整数,无法处理负数(带负号)、小数(带小数点),导致合法的数值会被误判为非数值,同时真正的非数值元素在后续转float时直接报错,无法按要求输出提示并终止。
解决方案代码
def is_valid_number(s): s = s.strip() # 处理空字符串情况 if not s: return False # 允许开头有一个负号 start = 0 if s[0] == '-': start = 1 # 只有负号的无效情况 if len(s) == 1: return False # 统计小数点数量,最多一个 dot_count = 0 for c in s[start:]: if c == '.': dot_count += 1 if dot_count > 1: return False elif not c.isdigit(): return False return True def parse_input_list(input_str): # 按逗号分割,处理每个元素的空格 elements = [ele.strip() for ele in input_str.split(',')] # 校验所有元素是否为合法数值 if not all(is_valid_number(ele) for ele in elements): print("was not able to calculate the correlation") exit() # 转换为float列表 return [float(ele) for ele in elements] def pearson_correlation(x, y): if len(x) != len(y): print("was not able to calculate the correlation") exit() n = len(x) # 计算各项求和值 sum_x = sum(x) sum_y = sum(y) sum_xy = sum([a*b for a,b in zip(x,y)]) sum_x_sq = sum([a**2 for a in x]) sum_y_sq = sum([b**2 for b in y]) # 计算分子分母 numerator = n * sum_xy - sum_x * sum_y denominator = ((n * sum_x_sq - sum_x**2) * (n * sum_y_sq - sum_y**2)) ** 0.5 # 处理分母为0的情况 if denominator == 0: print("was not able to calculate the correlation") exit() return numerator / denominator # 主程序 list1 = parse_input_list(input("Enter list1:")) list2 = parse_input_list(input("Enter list2:")) corr = pearson_correlation(list1, list2) print(f"{corr:.2f}")
代码说明
- 输入校验函数
is_valid_number:- 先去除元素前后空格,处理空元素
- 支持负号开头,且确保负号后有有效数字
- 限制小数点最多一个,其余字符必须是数字
- 输入解析函数
parse_input_list:- 分割输入字符串,处理每个元素的空格
- 用
all()结合校验函数判断所有元素合法性,不合法则输出提示并退出 - 合法则转换为float列表返回
- 皮尔逊相关系数计算
pearson_correlation:- 先判断两个列表长度是否一致,不一致则输出提示退出
- 手动计算求和项,按公式计算相关系数
- 处理分母为0的情况(避免除零错误)
- 主程序:
- 解析两个输入列表,计算并输出保留两位小数的相关系数
内容的提问来源于stack exchange,提问作者av i
相关产品推荐
相关产品推荐

