【ACM模式的输入输出练习】——python

我们进行机试时,通常都需要自己手动处理输入输出(我已经吃了一次大亏…),与力扣只需要核心代码的形式完全不同。
这篇文章将我遇到的所有输入输出形式进行总结,方便复习。

基本形式

一、从标准输入读取一行字符串

s = input()

这行代码的作用是从标准输入(通常是控制台)读取一行字符串,并将其赋值给变量s。具体步骤如下:

  • input()函数会等待用户在控制台输入一行文本,并按下回车键。
  • 输入的文本作为字符串被返回。
  • 这个返回值被赋值给变量s
  • 例如,如果用户输入hello world,那么s的值就是'hello world'

    二、从标准输入读取多个值并进行处理

    a, b = map(int, input().split())
    

    这行代码的作用是从标准输入读取一行包含多个值的字符串,将其分割后转换为整数,并分别赋值给变量ab。具体步骤如下:

  • input()函数获取用户输入的一行字符串,比如3 4
  • .split()方法将这行字符串按照空格进行分割,得到一个包含多个子字符串的列表,这里就是['3', '4']
  • map(int,...)将列表中的每个子字符串通过int函数进行转换,将其从字符串类型转换为整数类型,得到一个可迭代对象,其中包含整数34
  • a, b =...使用多重赋值,将可迭代对象中的第一个值赋值给a,第二个值赋值给b。所以这里a的值为3b的值为4
  • 三、循环读取多行输入

    while True:
        try:
            line = input()
            # 处理每一行输入
            #...
        except:
            break
    

    这段代码用于循环读取多行输入,直到出现异常情况(通常是文件结束或输入错误)。具体步骤如下:

  • while True:创建一个无限循环,会一直执行循环体中的代码,直到遇到break语句。
  • try:开始一个异常处理块。
  • line = input()在每次循环中从标准输入读取一行字符串,并将其赋值给变量line
  • 接下来可以在注释的位置对读取到的每一行输入进行处理,比如进行数据分析、计算等操作。
  • except:如果在执行try块中的代码时发生异常,就会执行这个部分的代码。这里通常是在没有更多输入时(比如文件结束)跳出循环,break语句会终止while循环。
  • 四、输出单个值或多个值

    print(1)
    print('hello', 2)
    
  • print(1)会将整数1输出到标准输出(通常是控制台)。
  • print('hello', 2)会将字符串'hello'和整数2输出到标准输出,多个值之间会用空格自动分隔开,所以输出结果为hello 2
  • 真题演练

    这部分的内容主要参考卡尔哥,感谢卡尔哥!

    1.1 A+B问题I——逐行输出

    一、题目描述

    这道题要求计算一系列输入的两个整数的和。输入包含多行,每行有两个整数,用空格隔开。对于每一行输入,需要输出这两个整数的和,且输出结果也每行一个。

    二、题目分析

    1. 输入形式:输入包含多行,每行有两个整数 ab,用空格隔开。
    2. 输出形式:对于每一行输入,输出一个整数,即 a + b 的结果,每行一个结果。

    三、代码实现及解释

    while True:
        try:
            a, b = map(int, input().split())
            print(a + b)
        except:
            break
    
  • while True: 创建一个无限循环,以便持续读取输入。
  • try: 开始一个异常处理块。
  • a, b = map(int, input().split()):从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给 ab
  • print(a + b):计算 a + b 并输出结果。
  • except: 如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。
  • 四、输入输出模板总结

    对于类似这种逐行读取输入并进行处理的问题,可以使用以下模板:

    while True:
        try:
            # 根据输入格式进行读取和处理
            #...
            # 输出结果
            print(result)
        except:
            break
    

    在读取和处理部分,根据具体的输入格式进行调整,比如这里是用 map(int, input().split()) 读取两个整数。输出部分根据题目要求输出相应的结果。

    这里我对 map() 比较陌生:

    在 Python 中,map()是一个内置函数,它将一个函数应用于可迭代对象(如列表、元组等)中的每个元素,并返回一个新的可迭代对象,其中包含函数应用后的结果。

    语法

    map(function, iterable,...)

  • function:要应用于可迭代对象中每个元素的函数。
  • iterable:一个或多个可迭代对象。
  • 示例用法

    # 定义一个函数,用于将传入的参数加 1
    def add_one(x):
        return x + 1
    
    numbers = [1, 2, 3, 4, 5]
    result = map(add_one, numbers)
    
    # 将结果转换为列表进行输出
    print(list(result))  # [2, 3, 4, 5, 6]
    

    在这个例子中,map()函数将add_one函数应用于列表numbers中的每个元素,返回一个新的可迭代对象,其中每个元素都比原来的元素大 1。

    如果有多个可迭代对象作为参数传递给map(),则function函数必须接受与可迭代对象数量相同的参数。例如:

    def add_two_numbers(x, y):
        return x + y
    
    numbers1 = [1, 2, 3]
    numbers2 = [4, 5, 6]
    result = map(add_two_numbers, numbers1, numbers2)
    print(list(result))  # [5, 7, 9]
    

    这里,add_two_numbers函数接受两个参数,map()函数将这个函数应用于两个列表中的对应元素,返回一个新的可迭代对象,其中包含两个列表中对应元素的和。

    input().split()以及int
    以下是对input().split()以及int在这行代码中的作用分析:

    一、input().split()

    1. input()

    2. 作用是从标准输入(通常是控制台)读取一行字符串。例如,用户在控制台输入3 4input()就会获取到这个字符串'3 4'
    3. 返回值是一个字符串。
    4. .split()

    5. 这是字符串的方法。对于由input()获取到的字符串,.split()方法会按照指定的分隔符将字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。
    6. 默认情况下,分隔符是空格。例如,对于输入'3 4'.split()会将其分割成['3', '4']这个列表。

    二、int的作用

    a, b = map(int, input().split())这行代码中,int的作用是将列表中的每个子字符串转换为整数类型。

    1. map(int,...)

    2. map函数将第一个参数(这里是int函数)依次应用于第二个参数(即input().split()返回的列表中的每个元素)。
    3. int函数尝试将每个子字符串转换为整数。例如,对于子字符串'3''4'int函数会将它们分别转换为整数 3 和 4。
    4. map函数返回一个可迭代对象,其中包含转换后的整数。
    5. a, b =...

    6. 使用多重赋值,将可迭代对象中的第一个值赋值给a,第二个值赋值给b。所以如果输入是3 4,最终a的值为 3,b的值为 4。

    2. A+B问题II——N行输入输出

    题目描述

  • 计算a+b,但输入方式有所改变。
  • 输入描述

  • 第一行是一个整数N,表示后面会有N行a和b,通过空格隔开。
  • 输出描述

  • 对于输入的每对a和b,你需要在相应的行输出a、b的和。 如第二对a和b,对应的和也输出在第二行。
  • 输入示例

  • 2

    2 4

    9 21

  • 输出示例

  • 6

    30

  • 提示信息

  • 注意,测试数据不仅仅一组。也就是说,会持续输入N以及后面的a和b
  • 一、题目描述

    本题要求计算多组整数的和。首先输入一个整数N,代表后续有N行,每一行包含两个整数ab,用空格隔开。对于每一组输入的ab,需要输出它们的和,且输出结果对应每一组输入分别占一行。这个过程会持续进行,不只是一组测试数据。

    二、输入输出形式分析

    1. 输入形式
    2. 首先输入一个整数N
    3. 接着输入N行数据,每行有两个整数ab,用空格隔开。
    4. 然后会再次输入一个新的整数N,接着又是N行相应的数据,如此循环。
    5. 输出形式
    6. 对于每一组输入的ab,输出它们的和,结果每行一个。

    三、代码实现及解释

    while True:
        try:
            N = int(input())
            for _ in range(N):
                a, b = map(int, input().split())
                print(a + b)
        except:
            break
    
  • while True: 创建一个无限循环,以便持续处理输入。
  • try: 开始一个异常处理块。
  • N = int(input()):从输入中读取一个整数N,表示后续数据的组数。
  • for _ in range(N): 这是一个循环,会循环N次,每次处理一组数据。
  • a, b = map(int, input().split()):在每次循环中,从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给ab
  • print(a + b):计算a + b并输出结果。
  • except: 如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。
  • 四、输入输出模板总结及重点

    模板:

    while True:
        try:
            # 读取表示数据组数的整数
            N = int(input())
            for _ in range(N):
                # 根据输入格式进行读取和处理每组数据
                #...
                # 输出结果
                print(result)
        except:
            break
    

    重点:

  • 使用无限循环和异常处理来持续处理输入。
  • 先读取表示数据组数的整数,然后根据这个整数进行循环处理每组数据。
  • 注意输入可能不只是一组测试数据,需要做好持续处理的准备。
  • 3. A+B——逐行输出&特定条件结束

    一、题目描述

    在这个任务中,你的使命依旧是计算两个数的和,即 a + b

    输入的形式为每行包含一对整数 ab。当出现一对 00 时,标志着输入的结束,并且这一对无需进行计算。

    输出的要求是对于每一对非 00 的整数对,在相应的行输出它们的和。例如,第二对 ab 的和应输出在第二行。

    二、输入输出形式分析

    1. 输入形式
    2. 输入由多行组成,每行有两个整数 ab,二者之间用空格分隔。
    3. 当输入为 0 0 时,意味着输入终止。且这一行不要计算!
    4. 输出形式
    5. 对于每一对非结束标志的整数对,在对应的行输出它们的和,结果每行一个。

    输入示例

  • 2 4
  • 11 19
  • 0 0
  • 输出示例

  • 6
  • 30
  • 三、代码实现及解释

    while True:
        line = input()
        a, b = map(int, line.split())
        if a == 0 and b == 0:
            break
        print(a + b)
    
  • while True: 创建一个无限循环,以便持续处理输入。
  • line = input():从输入中读取一行字符串。
  • a, b = map(int, line.split()):将读取的字符串用空格分割后转换为两个整数分别赋值给ab
  • if a == 0 and b == 0::判断如果输入为0 0,则跳出循环。
  • print(a + b):计算非0 0整数对的和并输出结果。
  • 四、输入输出模板总结及重点

    模板:

    while True:
        # 读取一行输入
        line = input()
        # 根据输入格式进行处理和判断是否结束输入
        if end_condition:
            break
        # 进行计算和输出结果
        print(result)
    

    重点:

  • 使用无限循环来持续处理输入,直到满足特定的结束条件。
  • 读取输入后,根据具体的输入格式进行处理和判断是否结束输入。
  • 对于非结束输入的情况,进行相应的计算并输出结果。
  • 4. A+B问题VI——逐行输出&行内处理&特定条件结束

    一、题目描述

    本题要求计算若干整数的和。输入的每一行以一个整数N开始,后面跟着N个整数。当N = 0时,表示输入结束,且这一行不需要进行计算。对于每一行非结束标志的输入,需要在相应的行输出这N个整数的和。

    二、输入输出形式分析

    1. 输入形式
    2. 输入由多行组成。
    3. 每行以一个整数N开头,表示后面有N个整数。
    4. 当出现N = 0时,输入结束。
    5. 输出形式
    6. 对于每一行非结束标志的输入,在相应的行输出这N个整数的和。

    三、代码实现及解释

    while True:
        line = input()
        nums = list(map(int, line.split()))
        n = nums[0]
        if n == 0:
            break
        s = sum(nums[1:])
        print(s)
    
  • while True: 创建一个无限循环,以便持续处理输入。
  • line = input():从输入中读取一行字符串。
  • nums = list(map(int, line.split())):将读取的字符串用空格分割后转换为整数列表。
  • n = nums[0]:提取出每行的第一个数,表示后面整数的个数。
  • if n == 0::判断如果第一个数为0,则跳出循环。
  • s = sum(nums[1:]):计算除第一个数之外的整数之和。
  • print(s):输出这一行整数的和。
  • 四、输入输出模板总结及重点

    模板:

    while True:
        # 读取一行输入并处理为整数列表
        nums = list(map(int, input().split()))
        # 提取第一个数判断是否结束输入
        n = nums[0]
        if n == 0:
            break
        # 计算并输出结果
        print(sum(nums[1:]))
    

    重点:

  • 使用无限循环处理输入,直到遇到结束标志。
  • 正确提取每行的第一个数作为后续整数个数的标志。
  • 对非结束标志的行,准确计算并输出相应的和。
  • A+B问题VII——空格行处理

    一、题目描述

    本题的任务是计算多组两个整数的和。输入由若干行组成,每行包含两个整数 ab,用空格分隔。对于每一组输入的 ab,需要输出它们的和,并且在每行输出结果后接着一个空行。

    二、输入输出形式分析

    1. 输入形式
    2. 输入包含多行,每行有两个整数 ab,用空格隔开。
    3. 输出形式
    4. 对于每一组输入的 ab,输出它们的和,结果每行一个,并且在每行输出结果后接着一个空行。

    三、代码实现及解释

    while True:
        try:
            a, b = map(int, input().split())
            print(a + b)
            print()
        except:
            break
    
  • while True: 创建一个无限循环,以便持续处理输入。
  • try: 开始一个异常处理块。
  • a, b = map(int, input().split()):从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给 ab
  • print(a + b):计算 a + b 并输出结果。
  • print():输出一个空行。
  • except: 如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。
  • 四、输入输出模板总结及重点

    模板:

    while True:
        try:
            # 根据输入格式进行读取和处理
            #...
            # 输出结果
            print(result)
            print()
        except:
            break
    

    重点:

  • 使用无限循环和异常处理来持续处理输入。
  • 正确读取和处理每组输入数据。
  • 输出结果后记得输出一个空行print()
  • 6. A+B 问题VIII——大缝合

    一、题目描述

    本题的任务是计算若干组整数的和。首先输入一个整数N,表示接下来有N组数据。每组数据中,第一行为一个整数M,接着在同一行内输入M个整数。需要输出每组数据中M个整数的和,每组输出之间输出一个空行。

    二、输入输出形式分析

    1. 输入形式
    2. 第一行输入一个整数N
    3. 接下来有N组数据,每组数据的第一行为一个整数M,然后在同一行内输入M个整数。
    4. 输出形式
    5. 对于每组数据,输出M个整数的和。
    6. 每组输出之间输出一个空行。

    三、代码实现及解释

    while True:
        try:
            n = int(input())
            for _ in range(n):
                line = list(map(int, input().split()))
                m = line[0]
                nums = line[1:]
                s = sum(nums)
                print(s)
                print()
        except:
            break
    

    以上代码显然是错误的!!

    输入示例
    3
    4 1 2 3 4
    5 1 2 3 4 5
    3 1 2 3
    输出示例
    10
    
    15
    
    6(到此为止,没有下一行了!上面代码不满足)
    
    提示信息
    注意以上样例为一组测试数据,后端判题会有很多组测试数据,也就是会有多个N的输入
    例如输入可以是:
    3
    4 1 2 3 4
    5 1 2 3 4 5
    3 1 2 3
    3
    4 1 2 3 4
    5 1 2 3 4 5
    3 1 2 3
    输出则是
    10
    
    15
    
    6#(这里是关键)
    10
    
    15
    
    6
    只保证每组数据间是有空行的。但两组数据并没有空行
    

    每组数据间有空行,但两组数据之间没有空行。
    以下是满足要求的代码及分析:

    while 1:
        try:
            n = int(input())
            for i in range(n):
                line = list(map(int, input().split()))
                print(sum(line[1:]))
                if i != n-1:
                    print()
        except:
            break
    /**************************************************************
        Problem: 1005
        User: odCYZ6qnDLQP5Tip3GOeHpulZ5iw [kamaCoder56559]
        Language: Python
        Result: 正确
        Time:155 ms
        Memory:15744 kb
    ****************************************************************/
    

    分析如下:
    以下是对给出代码的分析:

    一、题目描述

    本题的任务是计算若干组整数的和。首先输入一个整数N,表示接下来有N组数据。每组数据中,第一行为一个整数M,接着在同一行内输入M个整数。需要输出每组数据中M个整数的和,每组输出之间输出一个空行。并且后端判题会有很多组测试数据,每组数据间有空行,但两组数据之间没有空行。

    二、代码分析

    while 1:
        try:
            n = int(input())
            for i in range(n):
                line = list(map(int, input().split()))
                print(sum(line[1:]))
                if i!= n - 1:
                    print()
        except:
            break
    
    1. while 1::创建一个无限循环,与while True:效果相同,会持续处理输入直到遇到异常。
    2. try::开始异常处理块,用于捕获输入过程中可能出现的错误。
    3. n = int(input()):读取一个整数N,表示接下来有N组数据。
    4. for i in range(n)::根据N的值进行循环,处理每组数据。
    5. line = list(map(int, input().split())):在每次循环中,读取一行输入并将其转换为整数列表。
    6. print(sum(line[1:])):计算并输出除第一个整数(表示这组数据的个数)之外的整数之和。
    7. if i!= n - 1::判断当前是否不是最后一组数据,如果不是最后一组数据,则输出一个空行,以满足每组输出之间有空行的要求。
    8. except::如果在输入过程中出现异常,跳出循环。

    这段代码能够正确地处理输入并输出符合要求的结果,因为它准确地按照题目要求进行了输入读取、数据处理和输出控制。在循环中,正确地处理了每组数据的和的计算以及输出空行的条件判断,从而满足了题目中多组数据输入且每组数据间有空行、两组数据之间没有空行的要求。

    重点:

  • 读懂题目要求的逻辑:只要不是本轮输出的最后一次输出,就添加一行。
  • 否则就不加这一行。
  • 作者:weixin_47868976

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【ACM模式的输入输出练习】——python

    发表回复