python刷题第七周

以下是有所收获的题目:

第一题:

第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的长度即可得到符合的总个数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值