以下是有所收获的题目:
第一题:
第5章-2 图的字典表示 (20 分)
图的字典表示。输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度。比如上图0点表示:
{‘O’:{‘A’:2,‘B’:5,‘C’:4}}。用eval函数处理输入,eval函数具体用法见第六章内置函数。输入格式: 第一行表示输入的行数 下面每行输入表示一个顶点和该顶点相连的边及长度的字符串
输出格式: 在一行中输出顶点数,边数,边的总长度
代码:
n = int(input())
num = 0
s = 0
for i in range(n):
dic = eval(input())
for j in dic:
temp = dic[j]
for k in temp:
num += 1
s += temp[k]
print("{:d} {:d} {:d}".format(n, num, s))
收获:
1.之前对字典都不太清楚怎么处理,经过这道题目的学习清楚了很多。
2.接触到eval函数:eval函数就是实现list、dict、tuple与str之间的转化。
第二题
第5章-3 四则运算(用字典实现) (30 分) 四则运算(用字典实现),比较c语言的switch语句。
输入格式: 在一行中输入一个数字 在一行中输入一个四帜运算符(+,-,*,/) 在一行中输入一个数字
输出格式: 在一行中输出运算结果(小数保留2位)
参考代码:
rule={'+':1,'-':2,'*':3,'/':4}
a=int(input());op=input();b=int(input())
op=rule[op]
if op==1:
print("{:.2f}".format(a+b))
elif op==2:
print("{:.2f}".format(a-b))
elif op==3:
print("{:.2f}".format(a*b))
elif op==4:
if b==0:
print("divided by zero")
else:
print("{:.2f}".format(a/b))
num1 = int(input())
op = input()
num2 = int(input())
operation = {'+': 'num1 + num2', '-': 'num1 - num2', '*': 'num1 * num2', '/': "num1 / num2 if num2 != 0 else 'divided by zero'"}
res = eval(operation[op])
if type(res) != str:
print("%0.2f", res)
else:
print(res)
收获:
1.这道题用字典可以有两种做法:第一种是将运算符分别对应某一个值,然后再通过if来判断进行哪种运算。第二种是将运算符在字典中分别对应计算方式,然后通过eval函数实现运算。
第三题
第5章-5 统计字符出现次数 (20 分) 本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式: 输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式: 在一行中输出给定字符在给定字符串中出现的次数。
代码:
ls = list(input())
ch = input()
count = 0
# while ' ' in ls:
# ls.remove(' ')
for i in ls:
if i == ch:
count += 1
print(count)
收获:
1.对于输入的字符串,可以强制转换为列表,这样可以对每一个字符单独进行处理。
2.对于列表中的空格,可以通过
while ' ' in ls:
ls.remove(' ')
删除所有空格
3.在这道题里不能删除空格,因为还有可能要统计空格的个数。
第四题
第5章-6 统计工龄 (20 分) 给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。
输入格式: 输入首先给出正整数N(≤10 5 ),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。
输出格式: 按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。
别人的代码:
n = int(input())
list1 = list(map(int,input().split()))
dict1 = {}
for i in range(0,n):
#.get(key,default) key指的是键,default如果在字典dict1中没有找到对应的键的话,返回默认的值;
dict1[list1[i]] = dict1.get(list1[i],0) + 1
#对键进行排序,得到排序后键的集合dict2;
dict2 = sorted(dict1.keys())
#遍历键dict2,依次取出对应的值;
for i in dict2:
print("%d:%d"%(i,dict1[i]))
exit(0)
收获:
1.学习到了dict.get(key,default)函数,如果字典里没有对应的key就返回默认的default值。
通过这个函数,如果没有,则从0开始,如果没有,则在原有基础上加一。
2.dict2 = sorted(dict1.keys())将字典按照键进行排序。
第五题
第5章-7 列表去重 (40 分) 输入一个列表,去掉列表中重复的数字,按原来次序输出!
输入格式: 在一行中输入列表
输出格式: 在一行中输出不重复列表元素
别人的代码:
str1 = eval(input())
str2 = list(set(str1))
print(' '.join(map(str,sorted(str2,key = str1.index))))
收获:
1.利用eval函数将输入的列表转化为列表形式
2.利用set函数将列表去重
3.sorted(str2,key = str1.index)将str2以str1的次序输出
第六题
第5章-8 能被3,5和7整除的数的个数(用集合实现) (30 分) 求指定区间内能被3,5和7整除的数的个数
输入格式: 在一行中从键盘输入2个正整数a,b(1<=a<b<=10000000),用空格隔开。
输出格式: 在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。
别人的代码:
set3 = set()
set5 = set()
set7 = set()
a,b = map(int,input().split())
for num in range(a,b+1):
if num % 3 == 0:
set3.add(num)
if num % 5 == 0:
set5.add(num)
if num % 7 == 0:
set7.add(num)
result = set3 & set5 & set7
print(len(result))
收获:
1.一开始写这道题的时候,没有看到要用集合的方法,于是这道题就变得异常简单了,只需要便利a到b中的数,只要符合要求count++,最后输出count就OK了。
2.我对python集合相关的知识近乎空白,只好去网上搜索学习了。
3.相关的知识:
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合
4.在代码中,先是设置了3个空集合,然后如果符合某一个数字整除,就会加入到其集合里,遍历结束之后,利用&将3个集合中共有的数字提取出来放进result集合中,通过length获取result的长度即可得到符合的总个数。