Python程序设计(三)
07组合逻辑类型-列表
1.阿拉伯数字转换成拼音
利用列表实现以下功能:
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
…
9: jiu
输入 | 输出 |
---|---|
-600 | fu liu ling ling |
#方法一
num=input()
py=['ling','yi','er','san','si','wu','liu','qi','ba','jiu']
flag=0
if num[0]=='-':
start=1
print('fu',end='')
flag=1
else:
start=0
for i in range(start,len(num)):
if flag==1:
print(' {}'.format(py[int(num[i])]),end='')
else:
print('{}'.format(py[int(num[i])]),end='')
flag=1
#方法二
pinying = {'0':'ling','1':'yi','2':'er','3':'san',
'4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu'}
a = input()
b = len(a)-1
for i in range (b):
if i == 0 and a[i] == '-':
print('fu',end=' ')
else:
print(pinying[a[i]],end=' ')
b=pinying[a[-1]]
print(b)
2. 打印出现次数最多的数
接收一个列表,找出其中数量最多的元素,如果元素数量相同,选择列表中靠前的元素输出。
counts={}
num=input()
for i in num:
counts[i]=counts.get(i,0)+1
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
NUM,ss=items[0]
print(int(NUM))
3.列表中一位特定数字的移动
对于一个列表,在保持非零元素相对顺序的同时,将元素中所有的数字0移动到末尾。
例如,获得输入列表 [0, 1, 0, 3, 12],输出 [1, 3, 12, 0, 0]。
x=eval(input())
a = len(x)
for i in range(a):
if x[i] != 0:
i+=1
elif x[i] == 0:
del x[i]
x.append(0)
print(x)
08组合逻辑类型-字典
1.词频统计
请统计该文件中出现英文的词频,按照如下格式打印输出前10个高频词语:
the , 1138
…
即:英文单词(左对齐,宽度为10)+ 逗号 + 词语出现的频率(右对齐,宽度为5)
要求与说明:
1. 标点符号及组合不算作英文词语,去除的标点及特殊符号如下 !"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~
3. 同一单词的各种大小写形式记作一个词,如The和the相同
5. 在程序中,请使用文件名打开文件:hamlet.txt
def getText(): #第一步:分解并提取英文文章的单词
txt = open("hamlet.txt", "r").read()
txt = txt.lower() #将字母变成小写,同一个单词不用加以区分大小写
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch, " ") #将文本中特殊字符替换为空格
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words: #第二步:使用字典,键为单词,值为词频,对每个单词进行计数
counts[word] = counts.get(word,0) + 1 #如果word在counts中,则返回word对应的值,如果不在返回0
items = list(counts.items()) #字典类型没有顺序,将其转换为有顺序的列表类型
items.sort(key=lambda x:x[1], reverse=True) #第三步:对单词的统计值从高到低进行排序
for i in range(10): #输出词频高的前10项
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
2.统计字符出现频率
由用户输入若干个数字,中间用“,”分割。
编写程序统计这些数字的出现频率,保存为:“数字:出现的次数”。
如果用户没有输入数字(例如:回车、字符等),系统提示“请输入一个数字。”
输入 | 输出 |
---|---|
1,2,3,4,3,2,5,5,5 | {1: 1, 2: 2, 3: 2, 4: 1, 5: 3} |
try:
numbers = input().split(',')
count = {}
for num in numbers:
count[eval(num)] = count.get(eval(num), 0) +1
print(count)
except:
print('请输入一个数字。')
09文件和数据格式化
1.读取文件内容
编写代码读取文件fruit.txt中的内容,并输出到屏幕上。fruit.txt可提前自定义
#方法一
file = open('fruit.txt','r') #打开附件中的文件
#file .seek(0) #指针回到文件开始
for line in file : #逐行读文件,输出默认换行
print(line)
file .close() #关闭文件
#方法二
with open('fruit.txt', 'r', encoding='utf-8') as f:
print(f.read())
2. 简单文件写入
将学号和姓名写入文件,test.txt可自定义
file = open('test.txt','w+',encoding='utf-8')
ls = ['学号','姓名']
file.writelines(ls)
file.close()
3.分行写入文件
分三行将你的学号、姓名、和班级信息写入文件 name.txt,然后将文件name.txt中的内容输出到屏幕上显示。
#方法1
ls = input("请输入你的学号、姓名和班级:").split(",")
#ls = ['0001','小明','16软工1班']
print(ls)
file = open('D:/name.txt','w+')
file.writelines('\n'.join(ls))
file.seek(0)
print(file.read())
file.close()
#方法2
file = open('name.txt','w+',encoding='utf-8')
file.write('001'+'\n') #writelines默认不换行,用此法可以实现换行
file.write('小明'+'\n')
file.write('16级软工1班'+'\n')
file.seek(0)
for line in file:
print(line,end='')
file.close()
4.随机生成密钥
用户输入一个整数n,编程实现如下操作:
随机生成n个密钥,每个密钥24位,由大、小写字母和数字组成,每6位用一个连字符连接。
将每行一个密钥输出在屏幕上,同时按每行一个密钥的格式写入当前路径下key.txt中。
提示:可以使用string库和下面的方法获取字母和数字
import string
characters = string.ascii_letters + string.digits
random.choice(characters) #然后在characters 中随机生成密钥所需的元素
import random
import string
def key(num):
f = open('key.txt', 'w')
for _ in range(num):
keySn = []
for i in range(4):
s = ''
characters = string.ascii_letters + string.digits
for i in range(6):
s = s + random.choice(characters)
keySn.append(s)
key = '-'.join(keySn)
f.write(key + '\n')
print(key)
f.close()
num = int(input())
key(num)
输入 | 输出 |
---|---|
2 | VMRtTM-ZmV0vf-ASNIog-tuyNkn |
. | 5jIPCG-nOeFJD-JSJ7NH-4zUE8C |
10处理csv文件中的数据
从签到文件“0925.csv”中读取数据。【需要文件请私聊】
只保留有软件工程6班学生签到信息的行(注意:6班、六班之类的都是软件工程6班),将其他多余的行删除,
并将处理后的学生签到信息按照原有格式写入“已签到_0925_out.csv”文件中。
f=open('公共1127.csv')
ls=[]
for line in f:
line = line.replace('\n','')
ls.append(line.split(','))
f.close()
del ls[1] #文件第二行是空行
index =0
while index<len(ls):
ls[index][1] = ls[index][1].replace('.','')
#第二列是数字,不是学生姓名,则删除,并且列表元素序号不累加
if(ls[index][1].isnumeric()== True):
del ls[index]
else: #第二行是学生签到信息,则列表元素序号累加
index=index+1
f=open('公共1127_out.csv','w')
for row in ls:
f.write(",".join(row) + "\n")
f.close()