7-1 统计正数和负数的个数

编写一个程序来读入不指定个数的整数,然后统计读取的整数中有多少个正数和多少个负数并计算这些输入值的平均值。

输入格式:
在一行中输入若干个整数,以逗号分隔。

输出格式:
在第一行输出正数和负数的个数,以逗号分隔。

在第二行输出它们的平均值(保留小数后两位,如:12.30)。

输入样例:
在这里给出一组输入。例如:

12,3,-2,-56,100,62

输出样例:
在这里给出相应的输出。例如:

4,2
19.83

代码示例

number=list(input().split(','))
zheng=0
fu=0
sum=0
cishu=0
for num in number:
    cishu+=1
    if int(num)<0:
        fu+=1
    elif int(num)>0:
        zheng+=1
    sum+=int(num)
print('%d,%d'%(zheng,fu))
print('%.2f'%(sum/cishu))






7-2 求π的近似值

用公式求π的近似值:π²/6=1+1/2²+1/3²+1/4²+。。。
当求和项小于误差时,结束求和。

输入格式:
在一行输入误差范围

输出格式:
在一行输出π的近似值(保留6位小数)。

输入样例:
在这里给出一组输入。例如:

0.00000001

输出样例:
在这里给出相应的输出。例如:

3.141497

代码示例

wucha=float(input())
i=2
sum=0.0
jisuan=1.0
while jisuan>=wucha:
    sum+=jisuan
    jisuan=1/i**2
    i+=1
print("%.6f"%((sum*6)**0.5))






7-3 打印双休日

输入年份和月份,打印当月所有双休日日期,打印格式为:“2018-06-16”

输入格式:
年份和月份

输出格式:
双休日日期

输入样例:
在这里给出一组输入。例如:

2018 6

输出样例:
在这里给出相应的输出。例如:

2018-06-02
2018-06-03
2018-06-09
2018-06-10
2018-06-16
2018-06-17
2018-06-23
2018-06-24
2018-06-30

代码示例

import calendar

year, month = map(int, input("").split())

# 获取当月的日历
cal = calendar.monthcalendar(year, month)

# 遍历日历,找到双休日日期
for week in cal:
    for day in week:
        if day != 0 and calendar.weekday(year, month, day) >= 5:
            print(f"{year}-{month:02d}-{day:02d}")



代码解析

在这个程序中,我们首先使用map()函数和split()方法从用户那里获取年份和月份输入,并将它们分别赋值给year和month变量。

然后,我们使用calendar.monthcalendar(year, month)函数获取给定年份和月份的日历。这个函数返回一个二维列表,表示当月的日期布局。

接下来,我们遍历日历中的每个日期,并使用calendar.weekday(year, month, day)函数确定日期对应的星期几。如果星期几是5(即周六)或6(即周日),则将该日期格式化为"YYYY-MM-DD"的形式,并打印出来。





7-4 后天

已知今天的日期,请输出后天的日期。即,对于给定的日期,请计算出该日期加上2天的结果日期。
例如:今天的日期为2023-01-21,则后天的日期为2023-01-23。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个日期,日期形式为“yyyy-mm-dd”(年份4位,月份2位,日份2位,位数不足时前补0)。保证输入的日期合法,而且输入的日期和计算结果都在[1200-01-01,9999-12-31]范围内。

输出格式:
对于每组测试,在一行上以“yyyy-mm-dd”的形式输出结果日期。

输入样例:

2
2023-01-21
2023-02-27

输出样例:

2023-01-23
2023-03-01

代码示例

from datetime import datetime, timedelta

T = int(input(""))

for i in range(T):
    date_str = input("")
    date = datetime.strptime(date_str, "%Y-%m-%d")
    next_day = date + timedelta(days=2)
    next_day_str = next_day.strftime("%Y-%m-%d")
    print(next_day_str)



代码解析

在这个程序中,我们首先从用户那里获取测试数据的组数,并将其存储在变量T中。

然后,我们使用一个循环来处理每组测试数据。在每次循环中,我们从用户那里获取一个日期字符串,并使用datetime.strptime(date_str, "%Y-%m-%d")将其转换为datetime对象。

接下来,我们使用timedelta(days=2)创建一个timedelta对象,表示2天的时间间隔。我们将该时间间隔加到原日期上,得到后天的日期。

最后,我们使用strftime("%Y-%m-%d")将后天的日期对象转换为字符串形式,并打印出来。





7-5 统计字符个数

输入若干的字符串,每个字符串中只包含数字字符和大小写英文字母,统计字符串中有出现的不同字符的出现次数。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个字符串(不超过80个字符)。

输出格式:
对于每组测试,按字符串中有出现的字符的ASCII码升序逐行输出不同的字符及其个数(两个数据之间留一个空格),每两组测试数据之间留一空行,输出格式参照输出样例。

输入样例:

12123
A1c1B

输出样例:

1 2
2 2
3 1

1 2
A 1
B 1
c 1

代码示例

i=0
while True:
    try:
        string = input()
        count = {}

        for char in string:
            if char.isalnum():
                count[char] = count.get(char, 0) + 1
        if i!=0:
            print()
        sorted_chars = sorted(count.keys(), key=lambda x: ord(x))
        for char in sorted_chars:
            print(f"{char} {count[char]}")
        i+=1
    except:
        break



代码解析

在这个程序中,我们使用一个while循环来处理多组测试数据,直到遇到文件尾(通过EOFError异常)为止。

在每组测试数据的处理中,我们首先从用户那里获取一个字符串,并将其存储在变量string中。

然后,我们定义一个空字典count来存储字符出现的次数。我们遍历字符串中的每个字符,并使用isalnum()方法来判断字符是否为数字字符或字母字符。如果是,则将其添加到字典count中,并将其出现次数加1。

接下来,我们使用sorted()函数和lambda表达式对字典的键进行排序,按照字符的ASCII码升序排序。

最后,我们遍历排序后的字符列表,并打印每个字符以及其对应的出现次数。





7-6 敏感词过滤

现在基本上所有的网站都需要设置敏感词过滤,编程查找与敏感词列表相匹配的字符串,如果找到以*号替换,最终得到替换后的字符串。
假设敏感词列表由以下词组成:垃圾,陷阱,山寨,内幕,盗版。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬

输入格式:
输入一个字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬

输出格式:
替换敏感词后的字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬

输入样例:

很全的盗版软件,走过路过,不能错过!

输出样例:

很全的*软件,走过路过,不能错过!

代码示例

minggan=['垃圾','陷阱','山寨','内幕','盗版']
juzi=input()
for word in minggan:
    juzi=juzi.replace(word,'*')
print(juzi)






7-7 学车费用

小明学开车后,才发现他的教练对不同的学员收取不同的费用。
小明想分别对他所了解到的学车同学的各项费用进行累加求出总费用,然后按下面的排序规则排序并输出,以便了解教练的收费情况。排序规则:
先按总费用从多到少排序,若总费用相同则按姓名的ASCII码序从小到大排序,若总费用相同而且姓名也相同则按编号(即输入时的顺序号,从1开始编)从小到大排序。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据先输入一个正整数n(n≤20),然后是n行输入,第i行先输入第i个人的姓名(长度不超过10个字符,且只包含大小写英文字母),然后再输入若干个整数(不超过10个),表示第i个人的各项费用(都不超过13000),数据之间都以一个空格分隔,第i行输入的编号为i。

输出格式:
对于每组测试,在按描述中要求的排序规则进行排序后,按顺序逐行输出每个人费用情况,包括:费用排名(从1开始,若费用相同则排名也相同,否则排名为排序后的序号)、编号、姓名、总费用。每行输出的数据之间留1个空格。

输入样例:

3
Tom 2800 900 2000 500 600
Jack 3800 400 1500 300
Tom 6700 100
3
Tom 2800 400 100
Jack 3800 800
mary 3300

输出样例:

1 1 Tom 6800
1 3 Tom 6800
3 2 Jack 6000
1 2 Jack 4600
2 1 Tom 3300
2 3 mary 3300

代码示例

while True:
    try:
        n = int(input())
        students = []
        for i in range(n):
            line = input().split()
            name, fees = line[0], list(map(int, line[1:]))
            total_fees = sum(fees)
            students.append([name, total_fees, i+1])
        students.sort(key=lambda x: (-x[1], x[0], x[2]))
        rank = 1
        for i, s in enumerate(students):
            if i > 0 and s[1] < students[i-1][1]:
                rank = i+1
            print(rank, s[2], s[0], s[1])
    except EOFError:
        break



代码解析

首先,使用一个空列表students来存储学生信息,每个学生信息包括姓名、编号和总费用。通过输入来获取学生信息,并将其加入到students列表中。

然后,使用sort()方法对学生信息进行排序。sort()方法可以接受一个key参数,该参数是一个函数或 lambda 表达式,用于指定排序的规则。在本题中,我们需要先按总费用从高到低排序,如果总费用相同,则按姓名的 ASCII 码从小到大排序,如果总费用和姓名都相同,则按编号从小到大排序。

对于sort()方法的参数key,我们使用 lambda 表达式定义排序规则。lambda 表达式可以在一行代码中表示一个简单的函数。例如,(lambda x: x[2])表示一个函数,输入参数为一个列表x,返回值为列表x的第三个元素。key=lambda x: (-x[2], x[0], x[1])表示按照总费用从高到低排序,如果总费用相同,则按姓名的 ASCII 码从小到大排序,如果总费用和姓名都相同,则按编号从小到大排序。

最后,我们使用enumerate()函数和print()语句输出每个学生的费用情况。enumerate()函数可以在迭代一个可遍历的对象时,返回每个元素的索引和值。在本题中,我们需要输出每个学生的费用排名、编号、姓名和总费用。我们使用一个计数器rank来记录当前的费用排名,如果当前学生的总费用和前一个学生的总费用不同,那么费用排名就加1,否则费用排名不变。