202206-1-归一化处理
问题
思路
顺序流计算就完事了,使用lambda匿名函数来避免for循环
实现
- 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函数,从而
- 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
的匿名函数,该函数接受两个参数a
和b
,并返回它们的和。
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();