CCF-CSP 202206-1-归一化处理 (Python,C++) Python5行代码 lambda函数 满分实现

202206-1-归一化处理

问题

image-20230305173845396

image-20230305165143331

image-20230305173928715

思路

顺序流计算就完事了,使用lambda匿名函数来避免for循环

实现

image-20230305183220867

  • Python版
n = list(map(int, input().split()))[0] # n为待处理数的个数
a = [0] + list(map(int, input().split())) # a为待处理数列表——1到n

avg = sum(a[1:]) / n # 平均值
sqrt_var = (sum(list(map(lambda x:(x-avg)**2,a[1:]))) / n) ** 0.5 # 标准差

list(map(lambda x:print((x-avg) / sqrt_var),a[1:])) 

1、import math下的math.sqrt(x)的平替方式

  • x**0.5

2、lambda函数——以new_lst = list(map(lambda x: x*2, lst))为例

lambda x: x*2是一个匿名函数,用于将每个元素乘以2。map()函数将该函数依次应用到lst中的每个元素上,并返回一个新的可迭代对象。最后,使用list()函数将其转换为列表。

3、最后一行输出list(map(lambda x:print(x),f))可以得到结果,而map(lambda x:print(x),f)不行,

  • map(lambda x:print(x),f)直接返回了一个迭代器,其中包含了每个元素的None返回值,没有进行列表转换操作
  • list(map(lambda x:print(x),f)),调用了lambda函数,从而print
  • C++版本
# include<iostream>
# include<cmath>
using namespace std;

int main(){
	int n; // n为待处理数的个数
	cin >> n;
	int a[n+1]; //a为待处理数数组——1到n
	double sum = 0; //sum为待处理数的总和
  
	for(int i=1;i<=n;i++){
		cin >> a[i];
		sum = sum + a[i];
	}

	double avg = sum / n; // 平均值
	double d_fz = 0;
	for(int i=1;i<=n;i++){
		d_fz = d_fz + pow((a[i]-avg), 2);
	}
	double sqrt_var = sqrt(d_fz / n); //标准差

	for(int i=1;i<=n;i++){
		cout << (a[i] - avg) / sqrt_var << endl;
	}
	return 0;
}
C++注意数据类型的定义

⚠️:注意c++类型的设计(这里浪费了不少时间

最初,求平均值方式为:

int n; // n为待处理数的个数
int sum = 0; //sum为待处理数的总和
double avg = double(sum / n); // 平均值

是无效的,sum/n 直接是int类型/int类型

应该修改为

int n; // n为待处理数的个数
double sum = 0; //sum为待处理数的总和
double avg = sum / n; // 平均值

Appendix

lambda函数

lambda函数是一种匿名函数,它允许我们在代码中创建小型、一次性的函数。在Python中,lambda函数可以使用lambda关键字定义,并且可以接受任意数量的参数,但是只能有一个表达式。

lambda函数的语法如下:

lambda arguments: expression

其中,arguments表示lambda函数的参数列表,多个参数之间使用逗号进行分隔;expression表示lambda函数的返回值表达式。

下面是一个简单的示例,演示了如何使用lambda函数计算两个数的和:

sum = lambda a, b: a + b
print(sum(1, 2))  # 输出 3

在这个示例中,我们使用lambda函数定义了一个名为sum的匿名函数,该函数接受两个参数ab,并返回它们的和。

lambda函数通常与内置函数(如map()filter()等)一起使用,以提供一种简洁的方式来编写简单的功能。例如,以下代码使用lambda函数将列表[1, 2, 3]中的每个元素加倍:

list(map(lambda x: x * 2, [1, 2, 3]))  # 输出 [2, 4, 6]

在上面的代码中,lambda函数lambda x: x * 2用于计算每个元素的两倍,map()函数将该函数应用于列表中的每个元素,并返回一个包含结果的新列表。

读取文件方式以节省控制台输入数据的时间

  • 控制台读取方式
	int n; // n为待处理数的个数
	cin >> n;
	int a[n+1]; //a为待处理数数组——1到n
	double sum = 0; //sum为待处理数的总和
	for(int i=1;i<=n;i++){
		cin >> a[i];
		sum = sum + a[i];
	}
  • 文件读取方式
# include<fstream>
# include <iostream>
	ifstream infile("/Users/Code/SublimeCode/C++/temp.txt");
	int n; // n为待处理数的个数
	infile >> n;
	int a[n+1]; //a为待处理数数组——1到n
	double sum = 0; //sum为待处理数的总和
	for(int i=1;i<=n;i++){
		infile >> a[i];
		sum = sum + a[i];
	}
	infile.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值