初学者python总结
初学者python总结
一、前言
二、python知识点总结
三、问题解析
四、结束语
一、前言
本人第一次写博客,为大一新生,到了大学才了解到python,如今已经学习了一学期,对python有了一些见解,希望能与各位大佬交流一下。python总的来说还是比较简单的,可能是我学得还不够深入,但只要投入时间,就会得到回报。下面我对这一学期python的总结与一些题目的解析。
二、python知识点总结
以上是python总结的思维导图,有什么知识点遗漏的地方,希望大家能指点出来,补缺漏洞。
三、问题解析
泰迪杯B题7
1、根据附件 1 中的数据,提取每台售货机对应的 销售数据,保存在 CSV 文件中,文件名分别为 “task1-1A.csv”、“ task1-1B.csv”、…、task11E.csv”。
解题过程:
找出每台售货机对应的数据,(如图表格,地点那一列为 不同售货机的记号)如此一来,可以想办法将所有A、B、C、 D、E的数据分别提取出来
步骤一:有了初步思路,我们开始操作,首先读取文件,以列表 的形式读取
with open('附件1.csv','r+') as f:
k = f.readlines()
步骤二:遍历附件1中的每一行数据,然后将循环遍历中的数据 转化为列表,便于提取数据,再提取(附件1)中 ‘地点’ 那一列 数据(如图为b[6]),用简单的单分支结构判断是否为A售货机的 数据,最后写入文件中。
for x in a:
b = x.split(',')
if b[6] == 'A':
with open('task1-1A.csv','a+')as f1:
f1.write(x)
步骤三:已经提取了一个售货机的数据,其他还有难度吗?嗯, 没有了,只要将 (if b[6] == ‘A’???? 中的A换成其他字母再保存到 其他文件就完成任务了。(下图为完整代码)
with open('附件1.csv','r+') as f:
k = f.readlines()
a = k[1::]
for x in a:
b = x.split(',')
if b[6] == 'A':
with open('task1-1A.csv','a+')as f1:
f1.write(x)
当然,如果还嫌这样麻烦的话,我们可以改进一下
补充:我们将代码放入函数中,售货机记号作为参数,代码如图????
def y(z):
with open('附件1.csv','r+') as f:
k = f.readlines()
a = k[1::]
for x in a:
b = x.split(',')
if b[6] == 'A':
with open('task1-1A.csv','a+')as f1:
f1.write(x)
e = ['A','B','C','D','E']
for z in e:
y(z)
2、根据附件 1 中的数据,计算每台售货机 2017 年 4 月份的交易额、订单量及所有售 货机交易总额和订单总量。
(以计算售货机A的2017年4月份的交易额、订单量为例)
解题过程:
第一题中,以拿到各个售货机的数据,如此一来,只要从各个售 货机的数据中提取四月份的数据再进行处理即可
步骤一:有了初步思路,我们开始操作,首先赋值起始交易额、 订单量为0,再读取文件,以列表的的形式。
z = 0#交易额
n = 0#订单量
with open('附件1.csv','r+') as f:
k = f.readlines()
步骤二:遍历附件1中的每一行数据,然后将循环遍历中的数据 转化为列表,提取日期F那一列,然后提取年月日,最后选取月 份。用单分子判断是否为四月份的数据,再将交易额和订单量累 加起来,输出结果。
for x in k:
b = x.split(',')
c = b[5].split(' ')
d = c[0].split('/')
if d[1] == '4':
n += 1
z += float(b[3])
print('A售货机4月份的交易额:' + str(z))
print('A售货机4月份的订单量:' + str(n))
基本上完成任务,剩下的就是换个文件名称的问题了。
注意(用附件1文件计算所有售货机的交易额和订单时,要过滤 掉第一行无用数据)附上完整代码????
z = 0#交易额
n = 0#订单量
with open('附件1.csv','r+') as f:
k = f.readlines()
for x in k:
b = x.split(',')
c = b[5].split(' ')
d = c[0].split('/')
if d[1] == '4':
n += 1
z += float(b[3])
print('A售货机4月份的交易额:' + str(z))
print('A售货机4月份的订单量:' + str(n))
3、计算每台售货机每个月的每单平均交易 额与日均订单量
(以计算售货机A的2017年每个月的每单平均交易额与日均订单 量为例)
解题思路:
将每个月份的数据分隔开,再将各个月份的实付金额累加起来, 并计算每个月的订单量
步骤一:创建空列表[](用来装各个月份),读取文件,以列表的形式。
u = []
with open('task1-1E.csv','r+') as f:
k = f.readlines()
步骤二:遍历每行数据,取出各个月份,放入空列表中,再以各 个月份为键,初始值为0,构建字典j和字典t。
for x in k:
a = x.split(',')
c = a[5].split(' ')
d = c[0].split('/')
u.append(d[1])
j = {}.fromkeys(u,0)
t = {}.fromkeys(u,0)
步骤三:再次遍历每行数据,并取出各个月份,字典j中的值为 各个月份的交易额,字典t中各键的值为对应月份的订单量。在 遍历过程中不断累加。
for z in k:
b = z.split(',')
e = b[5].split(' ')
f = e[0].split('/')
j[f[1]] += float(b[3])
t[f[1]] += 1
步骤四:引入calendar模块(日历模块),遍历含有各个月份的 集合,计算每个月的每单平均交易额与日均订单量。
import calendar
for p in set(u):
r = j[p]/t[p]
h = t[p]/int(calendar.monthrange(2017,p)[1])
print(str(p)+'月的每单平均交易额为:'+ str(r))
print(str(p)+'月的日均订单量为:'+ str(h))
以上为售货机A的每单平均交易额与日均订单量,其他售货机同理。(附上完整代码)????
import calendar
u = []
with open('task1-1E.csv','r+') as f:
k = f.readlines()
for x in k:
a = x.split(',')
c = a[5].split(' ')
d = c[0].split('/')
u.append(d[1])
j = {}.fromkeys(u,0)
t = {}.fromkeys(u,0)
for z in k:
b = z.split(',')
e = b[5].split(' ')
f = e[0].split('/')
j[f[1]] += float(b[3])
t[f[1]] += 1
for p in set(u):
r = j[p]/t[p]
h = t[p]/int(calendar.monthrange(2017,p)[1])
print(str(p)+'月的每单平均交易额为:'+ str(r))
print(str(p)+'月的日均订单量为:'+ str(h))
我校2019年Python 数据分析职业技能大赛
任务 1 数据预处理
4、任务 1.1 编写代码检查订单日期,将错误日期订单在原始数据中删除。
解题思路:
如下图为附件1中的数据,首先我将日期提取出来,再分析每个月的天数是否正确,从而完成任务
步骤一:因为附件一中第一行数据会影响我的分析,所以我直接跳过第一行读取数据,然后将日期中日和月份提取出来。
with open('附件1.csv','r+')as f:
a = f.readlines()
a1 = a[1:]
for z in a1:
b = z.split(',')
c = b[1].split(' ')
d = c[0].split('-')
# d[1] 为月份
# d[2] 为日
步骤二:我发现当日和月份都由两个数组成,小于10时,其前面会带有一个0,使我无法分析。我决定将日和月份的两个数拆开,分类谈论(例:01 转化为 [0,1])。当日的十位数为0时,该日期不会出现错误;当日的十位数不为0时,判断该月的天数是否错误,最后写进新文件中。
e = ','.join(d[1]).split(',')
y = ','.join(d[2]).split(',')
if int(y[0]) == 0:
str1 = z
if int(y[0]) > 0:
if 0 < int(d[2]) <= int(calendar.monthrange(2019,int(y[0]))[1]):
str1 = z
with open('xinshuju.csv','a+')as f1:
f1.write(str1)
任务完成。(附上完整代码)????
import calendar
def y():
with open('附件1.csv','r+')as f:
a = f.readlines()
a1 = a[1:]
for z in a1:
b = z.split(',')
c = b[1].split(' ')
d = c[0].split('-')
# d[1] 为月份
# d[2] 为日
e = ','.join(d[1]).split(',')
y = ','.join(d[2]).split(',')
if int(y[0]) == 0:
str1 = z
if int(y[0]) > 0:
if 0 < int(d[2]) <= int(calendar.monthrange(2019,int(y[0]))[1]):
str1 = z
with open('xinshuju.csv','a+')as f1:
f1.write(str1)
5、任务 1.2 实销金额为 0 时,成本金额在[0, 300]区间表示该商品为普通赠品,成本金额大于 300 时该订单失效,需删除。 预处理后数据文件命名为 task1.csv。
解题思路:
我先判断实销金额是否为0,再分析成本金额是否在范围内,最后将正确数据写入文件。
步骤一:读取数据,取出实销金额。
with open ('xinshuju.csv','r+')as f:
data1 = f.readlines()
for line1 in data1[:5]:
sList = line1.split(',')
# sList[13] 为实销金额
步骤二:判断实销金额是否为0,若为0,再判断成本金额是否在[0,300]内,若是,则写入文件;若实销金额不为0,则直接写入文件。
if float(sList[13]) == 0:
if float(sList[14]) >= 0 and float(sList[14]) <=300:
str2 = line1
if float(sList[13]) != 0:
str2 = line1
with open('task1.csv','a+')as f2:
f2.write(str2)
任务完成。(附上完整代码)????
def x():
with open ('xinshuju.csv','r+')as f:
data1 = f.readlines()
for line1 in data1[:5]:
sList = line1.split(',')
# sList[13] 为实销金额
if float(sList[13]) == 0:
if float(sList[14]) >= 0 and float(sList[14]) <=300:
str2 = line1
if float(sList[13]) != 0:
str2 = line1
with open('task1.csv','a+')as f2:
f2.write(str2)
x()
任务 2 数据处理与统计
6、任务 2.1 根据“订单类型”字段,提取每种订单对应的数据,保存在 CSV文件中,文件名分别为“C01.csv”、“C02.csv”、“C03.csv”、“C04.csv”。
解题思路:
我由订单类型中看出第三个字符是变化的,于是我定义一个函数,变量为[1,2,3,4],根据订单类型的第三个字符与函数变量相同,将数据写进相对应的文件。
步骤一:定义一个p(z)函数,函数变量为z,读取数据并提取数据中订单类型中第三个字符。
def p(z):
with open('task1.csv','r+') as f:
k = f.readlines()
for x in k:
b = x.split(',')
c = ','.join(b[0]).split(',')
步骤二:根据订单类型的第三个字符与函数变量z相同,将每种订单对应的数据写进其对应的文件中,最后输入函数变量。
if int(c[2]) == z:
with open('C0'+ str(z) +'.csv','a+')as f1:
f1.write(x)
for h in range(1,5):
p(h)
任务完成。(附上完整代码)????
def p(z):
with open('task1.csv','r+') as f:
k = f.readlines()
for x in k:
b = x.split(',')
c = ','.join(b[0]).split(',')
if int(c[2]) == z:
with open('C0'+ str(z) +'.csv','a+')as f1:
f1.write(x)
for h in range(1,5):
p(h)
7、任务 2.2 统计每个一级商品类别的实际销售金额,将结果保存为“task2_2.csv”。
解题思路:
创建一个字典,我将每个一级商品类型作为字典的键,每个一级商品类别对应的实际销售金额作为值,再将结果写入文件,便可完成任务。
步骤一:我先创建一个空列表(装每个一级商品类型),读取数据,取出一级商品类别中的数据添加到空列表中,再创建一个字典j,每个一级商品类型作为字典的键,每个键所对应的初始值为0.
u = []
with open('task1.csv','r+') as f:
k = f.readlines()
for x in k:
h = x.split(',')
u.append(h[6])
j = {}.fromkeys(u,0)
步骤二:再次遍历数据,将各个一级商品类型对应的实际销售金额累加起来,最后写入文件中。
for z in k:
b = z.split(',')
j[b[6]] += float(b[13])
for v in set(u):
str1 = str(v) + ',' + str(j[v]) + '\n'
with open('Atask2_2.csv','a+')as f1:
f1.write(str1)
任务完成。(附上完整代码)????
u = []
with open('task1.csv','r+') as f:
k = f.readlines()
for x in k:
h = x.split(',')
u.append(h[6])
j = {}.fromkeys(u,0)
for z in k:
b = z.split(',')
j[b[6]] += float(b[13])
for v in set(u):
str1 = str(v) + ',' + str(j[v]) + '\n'
with open('Atask2_2.csv','a+')as f1:
f1.write(str1)
8、任务 2.3 统计每个分公司的“秋冬”商品实际销售金额和“春夏”商品实际销售金额,将结果保存为“task2_3.csv”。
解题思路:
与任务2.2的思路一致,创建一个字典,我将[每个公司+秋冬(春夏)]作为字典的键,对应的实际销售金额作为值。将结果写入文件便可完成任务。
步骤一:我先创建一个空列表(装每个公司+秋冬(春夏)),读取数据,取出(各分公司与服装季,两者凑成一个字符串)添加到空列表中,再创建一个字典j,每个公司+秋冬(春夏)作为字典的键,每个键所对应的初始值为0.
with open ("task1.csv","r") as f: # 打开同目录下(task1.csv)文件,简称为f
data = f.readlines() # 读取f文件中的数据
for line in data: # 遍历data中的数据
lineList = line.split(",") # 以‘,’为分隔符,构成新的列表
lineList = lineList[3] +','+ lineList[2]
listName.append(lineList) # 将各公司和季节写进空列表中
dic = {}.fromkeys(listName,0) # 将集合中的元素作为字典dic中的键,每个键的初始值0
(为何在分公司与服装季中间加上逗号,为后面写入csv文件提供了方便)
步骤二:步骤二:再次遍历数据,将每个公司+秋冬(春夏)对应的实际销售金额累加起来,最后写入csv文件中。
for line in data: # 遍历data中的数据
lineList1 = line.split(",") # 以‘,’为分隔符,构成新的列表
lineList = lineList1[3] +','+ lineList1[2]
dic[lineList] += float(lineList1[13]) # 将各公司与季节所对应的金额累加起来
for i in set(listName): # 遍历setName中的数据
str2 = str(i) + ',' + str(dic[i]) + '\n'
with open ("task2_3.csv","a+") as f1: # 创建名为:task2_3 的csv文件,简称为f1
f1.write(str2)
任务完成。(附上完整代码)????
listName =[]
def x23()
with open ("task2_3.csv","a+") as f3: # 增加表头
str1 = '分公司'+ ',' + '服装季'+ ',' + '商品实际销售金额' + '\n'
f3.write(str1)
with open ("task1.csv","r") as f: # 打开同目录下(task1.csv)文件,简称为f
data = f.readlines() # 读取f文件中的数据
for line in data: # 遍历data中的数据
lineList = line.split(",") # 以‘,’为分隔符,构成新的列表
lineList = lineList[3] +','+ lineList[2] # 将集合中的元素作为字典dic中的键,每个键的初始值0
listName.append(lineList) # 将各公司和季节写进空列表中
dic = {}.fromkeys(listName,0)
for line in data: # 遍历data中的数据
lineList1 = line.split(",") # 以‘,’为分隔符,构成新的列表
lineList = lineList1[3] +','+ lineList1[2]
dic[lineList] += float(lineList1[13]) # 将各公司与季节所对应的金额累加起来
for i in set(listName): # 遍历setName中的数据
str2 = str(i) + ',' + str(dic[i]) + '\n'
with open ("task2_3.csv","a+") as f1: # 创建名为:task2_3 的csv文件,简称为f1
f1.write(str2)
x23()
9、任务 2.4 统计“直营客户”和“加盟客户”每月的实际订购金额和订单量, 将结果保存为“task2_4.csv”。
解题思路:
创建四个字典,两个将(月份)作为字典的键,对应的实际销售金额作为值,另两个将(月份)作为字典的键,对应的订单量作为值,最后将结果写入文件便可完成任务。
步骤一:创建两个空列表u和o,u用来装(客户类型),o用来装(月份)。遍历数据,取出各月份和客户类型,将各个月份添加到列表o中,各个客户类型添加到列表u中。再创建四个字典dian1、dian2、j、t,字典dian1和j分别表示“直营客户”每月的实际订购金额和订单量;字典dian2和t分别表示“加盟客户”每月的实际订购金额和订单量。
o = [] # 创建空列表
with open('task1.csv','r+') as f: # 打开同目录下(task1.csv)文件,简称为f
k = f.readlines() # 读取f文件中的数据
for x in k: # 遍历k中的数据
a = x.split(',') # 以‘,’为分隔符,构成新的列表
l = a[1].split(' ') # 以‘ ’为分隔符,构成新的列表
m = l[0].split('-') # 以‘—’为分隔符,构成新的列表
h = ','.join(m[1]).split(',') # 将月份分开(例:01转化为0,1)
o.append(h[1]) # 将月份的数据加入空列表中
dian1 = {}.fromkeys(o,0) # 将列表中的元素作为字典j中的键,每个键的初始值0
dian2 = {}.fromkeys(o,0)
j = {}.fromkeys(o,0)
t = {}.fromkeys(o,0)
步骤二:再次遍历数据,取出各月份,用两个单分支累加“直营客户”和“加盟客户”每月的实际订购金额和订单量,最后将结果写入文件中。
for z in k: # 遍历k中的数据
list1 = z.split(',') # 以‘,’为分隔符,构成新的列表
c = list1[1].split(' ') # 以‘ ’为分隔符,构成新的列表
d = c[0].split('-') # 以‘—’为分隔符,构成新的列表
e = ','.join(d[1]).split(',') # 将月份分开(例:01转化为0,1)
if list1[4] == '01|直营客户': # 若list1[4]为'01|直营客户'执行以下语句块
dian1[e[1]] += float(list1[13]) # 累加各月份的销售额
t[e[1]] += 1 # 累加销售量
if list1[4] == '02|加盟客户': # 若list1[4]为'02|加盟客户'执行以下语句块
dian2[e[1]] += float(list1[13]) # 累加各月份的销售额
j[e[1]] += 1 # 累加销售量
for jine in set(o): # 遍历集合o中的数据
str2 = '01|直营客户,' + str(jine) +'月'+ ',' +str(dian1[jine]) + ',' + str(t[jine])+ '\n'
with open('task_2.4.csv','a+')as f3: # 创建名为:task2_4 的csv文件,简称为f3
f3.write(str2) # 将字符串str2写f1文件中
for jine in set(o): # 遍历集合o中的数据
str2 = '02|加盟客户,' + str(jine) +'月'+ ',' + str(round(dian1[jineA],2)) + ',' + str(j[jine])+ '\n'
with open('task2_4.csv','a+')as f3: # 打开名为task2_4的csv文件,简写为f3
f3.write(str2) # 将字符串str2写f1文件中A
任务完成。(附上完整代码,略长)????
def x24(): # 定义x24函数
o = [] # 创建空列表
with open('task1.csv','r+') as f: # 打开同目录下(task1.csv)文件,简称为f
k = f.readlines() # 读取f文件中的数据
for x in k: # 遍历k中的数据
a = x.split(',') # 以‘,’为分隔符,构成新的列表
l = a[1].split(' ') # 以‘ ’为分隔符,构成新的列表
m = l[0].split('-') # 以‘—’为分隔符,构成新的列表
h = ','.join(m[1]).split(',') # 将月份分开(例:01转化为0,1)
o.append(h[1]) # 将月份的数据加入空列表中
dian1 = {}.fromkeys(o,0) # 将列表中的元素作为字典j中的键,每个键的初始值0
dian2 = {}.fromkeys(o,0)
j = {}.fromkeys(o,0)
t = {}.fromkeys(o,0)
for z in k: # 遍历k中的数据
list1 = z.split(',') # 以‘,’为分隔符,构成新的列表
c = list1[1].split(' ') # 以‘ ’为分隔符,构成新的列表
d = c[0].split('-') # 以‘—’为分隔符,构成新的列表
e = ','.join(d[1]).split(',') # 将月份分开(例:01转化为0,1)
if list1[4] == '01|直营客户': # 若list1[4]为'01|直营客户'执行以下语句块
dian1[e[1]] += float(list1[13]) # 累加各月份的销售额
t[e[1]] += 1 # 累加销售量
if list1[4] == '02|加盟客户': # 若list1[4]为'02|加盟客户'执行以下语句块
dian2[e[1]] += float(list1[13]) # 累加各月份的销售额
j[e[1]] += 1 # 累加销售量
for jine in set(o): # 遍历集合o中的数据
str2 = '01|直营客户,' + str(jine) +'月'+ ',' +str(dian1[jine]) + ',' + str(t[jine])+ '\n'
with open('task_2.4.csv','a+')as f3: # 创建名为:task2_4 的csv文件,简称为f3
f3.write(str2) # 将字符串str2写f1文件中
for jine in set(o): # 遍历集合o中的数据
str2 = '02|加盟客户,' + str(jine) +'月'+ ',' + str(round(dian1[jineA],2)) + ',' + str(j[jine])+ '\n'
with open('task2_4.csv','a+')as f3: # 打开名为task2_4的csv文件,简写为f3
f3.write(str2) # 将字符串str2写f1文件中A
x24()
10、任务 2.5 根据“商品名和编码”字段,统计不重复商品名及其对应一二级类,将结果保存为“task2_5.csv”。
解题思路:
与之前一样的思路,创建一个字典,商品名作为键,商品名对应一二级类为值,最后将结果写入文件即可。
步骤一:创建一个新列表(装商品名),读取数据,取出各个商品名的数据,添加到空列表中,再创建新字典,以各个商品名作为键,各键对应的值起始为空。
namelist1 = []
str2 = '商品名' + ',' + '一级商品类别' + ',' + '二级商品类别' + '\n'
with open('task2_5.csv','a+')as f: # 添加表头
f.write(str2)
with open('task1.csv','r+')as f: # 打开同目录下(task1.csv)文件,简称为f
data1 = f.readlines() # 读取f文件中的数据
for line in data1: # 遍历data1中的数据
nameline = line.split(',') # 以‘,’为分隔符,构成新的列表
nameline1 = nameline[8].split('|') # 以‘|’为分隔符,构成新的列表
namelist1.append(nameline1[1]) # 将nameline[8]内的数据加入空列表中
j = {}.fromkeys(namelist1,'')
步骤二:再次遍历数据,将商品名对应一二级类添加入字典,最后将结果写入文件中。
for line in data1: # 遍历data1中的数据
nameline2 = line.split(',') # 以‘,’为分隔符,构成新的列表
nameline3 = nameline2[8].split('|') # 以‘|’为分隔符,构成新的列表
str1 = nameline2[6] + ',' + nameline2[7]
j[nameline3[1]] = str(str1)
for o in set(namelist1): # 遍历var中的数据
str2 = str(o) +","+ str(j[o]) + "\n"
with open('Atask2_5.csv','a+')as f1: # 创建名为:task1 的csv文件,简称为f2
f1.write(str2)
任务完成。(附上完整代码,略长)????
def x25():
namelist1 = []
str2 = '商品名' + ',' + '一级商品类别' + ',' + '二级商品类别' + '\n'
with open('task2_5.csv','a+')as f: # 添加表头
f.write(str2)
with open('task1.csv','r+')as f: # 打开同目录下(task1.csv)文件,简称为f
data1 = f.readlines() # 读取f文件中的数据
for line in data1: # 遍历data1中的数据
nameline = line.split(',') # 以‘,’为分隔符,构成新的列表
nameline1 = nameline[8].split('|') # 以‘|’为分隔符,构成新的列表
namelist1.append(nameline1[1]) # 将nameline[8]内的数据加入空列表中
j = {}.fromkeys(namelist1,'')
for line in data1: # 遍历data1中的数据
nameline2 = line.split(',') # 以‘,’为分隔符,构成新的列表
nameline3 = nameline2[8].split('|') # 以‘|’为分隔符,构成新的列表
str1 = nameline2[6] + ',' + nameline2[7]
j[nameline3[1]] = str(str1)
for o in set(namelist1): # 遍历var中的数据
str2 = str(o) +","+ str(j[o]) + "\n"
with open('Atask2_5.csv','a+')as f1: # 创建名为:task1 的csv文件,简称为f2
f1.write(str2)
x25()
课后作业
11、数据分析中的异常处理 使用 testError.csv 数据(qq 群下载),统计每种商品的销售额。
提示:testError.csv 中的销售额存在非数字格式的”NA”值,还存在数据缺失的情 况。直接使用文件操作作业第二题的代码计算会抛出异常,需要使用 try…语句完 善代码,实现读取数据时的异常处理。
解题思路:
从数据中可以看出,数据出现了两种错误,一是实际金额为NA的,二是空白的,我认为可以先将统计每种商品销售额的代码打出来,运行再观察哪个地方出现了错误,再使用try…语句完善代码。
步骤一:先假设数据都是正确的,写出计算商品销售额的代码。
b = []
with open('testError.csv','r+')as p: # 打开同一目录下命名为'testError'的csv文件进行读写模式,简称为p,操作结束后自动关闭文件
k = p.readlines() # 读取p中的数据,并转化为列表
for x in k: # 循环变量x遍历列表k
a = x.split(',') # 将变量x以‘,’为分隔符创建新列表a
b.append(a[4]) # 将列表l中下标为4的元素添加到列表b中
j = {}.fromkeys(set(b),0) # 将列表b转化为集合(去重),并将集合中的元素作为字典j中的键,每个键的初始值0
for z in k: # 循环变量x遍历列表k
lineList = z.split(',') # 将变量z以‘,’为分隔符创建新列表lineList
j[lineList[4]] += float(lineList[3]) # 将字典j中每个键相对应的值累加起来
for i in set(b): # 循环变量i遍历集合b
str1 = i + ',' + str(j[i]) + '\n'
with open('saleALL.csv','a+')as v: # 新建名为‘saleAll’的csv文件,并命名为v
v.write(str1)
步骤二:运行步骤一中代码,可以知道( j[lineList[4]] += float(lineList[3]) )在累加销售额时会发生异常,因为字符串‘NA’不能转化为浮点数。所以我将累加销售额这句代码放进str语句中,即可实现过滤错误数据。
b = []
with open('testError.csv','r+')as p: # 打开同一目录下命名为'testError'的csv文件进行读写模式,简称为p,操作结束后自动关闭文件
k = p.readlines() # 读取p中的数据,并转化为列表
for x in k: # 循环变量x遍历列表k
a = x.split(',') # 将变量x以‘,’为分隔符创建新列表a
b.append(a[4]) # 将列表l中下标为4的元素添加到列表b中
j = {}.fromkeys(set(b),0) # 将列表b转化为集合(去重),并将集合中的元素作为字典j中的键,每个键的初始值0
for z in k: # 循环变量x遍历列表
lineList = z.split(',') # 将变量z以‘,’为分隔符创建新列表lineList
try:
j[lineList[4]] += float(lineList[3]) # 将字典j中每个键相对应的值累加起来
except:
pass
for i in set(b): # 循环变量i遍历集合b
str1 = i + ',' + str(j[i]) + '\n'
with open('saleALL.csv','a+')as v: # 新建名为‘saleAll’的csv文件,并命名为v
v.write(str1)
步骤三:经过步骤的修改后,代码不会出现报错了,但是在新文件中,我发现还是会有空白行出现,如何去掉空白行呢,销售额那一列的错误已经解决,剩下就是商品名的问题,我发现集合b中会有空白商品名,所以我在集合b形成之前过滤掉空白。
b = []
with open('testError.csv','r+')as p: # 打开同一目录下命名为'testError'的csv文件进行读写模式,简称为p,操作结束后自动关闭文件
k = p.readlines() # 读取p中的数据,并转化为列表
for x in k: # 循环变量x遍历列表k
a = x.split(',') # 将变量x以‘,’为分隔符创建新列表a
try:
float(a[3])
b.append(a[4]) # 将列表l中下标为4的元素添加到列表b中
except:
pass
j = {}.fromkeys(set(b),0) # 将列表b转化为集合(去重),并将集合中的元素作为字典j中的键,每个键的初始值0
for z in k: # 循环变量x遍历列表
lineList = z.split(',') # 将变量z以‘,’为分隔符创建新列表lineList
str:
j[lineList[4]] += float(lineList[3]) # 将字典j中每个键相对应的值累加起来
except:
pass
for i in set(b): # 循环变量i遍历集合b
str1 = i + ',' + str(j[i]) + '\n'
with open('s0aleALL.csv','a+')as v: # 新建名为‘saleAll’的csv文件,并命名为v
v.write(str1)
如此操作后,空白行也去掉了,问题也算是解决了。
12、打印乘法表。
解题思路:
找到乘法表的规律(11=1,21=2,22=4,…),可以发现乘法表的每一行的式子(11=1)数目都由第一个数决定,我想到了用两个for循环,第一个for循环作为每个式子第一个数,第二个for循环控制式子数目。
for x in range(1,10): # 由循环变量x计数循环(num+1次)
for z in range(1,x+1): # 由循环变量z计数循环(x+1次)
print("%d*%d=%2d"%(x,z,x*z),end=" ") # 输出结果,并用" "代替换行
print() # 内层for in结束,输出,使外层for in循环一次的结果分行
13、返回第 n 个 fibonaccia 数
解题思路:第n个fibonaccia 数是由其前两项相加而得,即要讨论n<=1时,n>1时两种情况。当n<=1时,即 fibonaccia 数为其本身,当n>1时,第n个fibonaccia 数= 第n-1个+第n-2个。
def fib(n):
'''返回第 n 个 fibonaccia 数'''
a,b = 0,1
if n<=1:
return n
for i in range(2, n+1):
a,b = b,a+b
return b
也可用递推的方法
def fib_rec(n):
if n<=1:
return n
return fib(n-1)+fib(n-2)
14、将字典按照value的值从大到小排序
解题思路:
要将字典按照value的值排序,就要先将其提取出来,或是表达出来,然后用匿名函数,value的值作为变量进行排序。
def sort_dict(d):
d = list(d.items())
d = sorted(d, key=lambda t:t[1], reverse=True)
return d
15、计数有序数据元素 e 的数量
解题思路:
可先遍历有序数据,再运用单分支判断循环变量是否为e,若为e,元素e的数量+1;若不为e,元素e的数量不变
def the_count(seq, e):
_c = 0
for j in seq:
if j==e:
_c += 1
return _c
四、结束语
python还是比较有趣的,就跟游戏一样,玩得越多就会挖掘出越多的彩蛋,希望以后能与大家共同游戏。
上一篇: java爬虫系列(二)——爬取动态网页
下一篇: 看生物演化的感悟