背景
sys.stdin主要用来读取键盘的一行或者多行输入,读取后表达形式为字符串。
下文主要探讨sys.stdin.readline()的使用,sys.stdin.read()参考:
- sys.stdin.readline()是逐行读取,通常会配合.strip()清除首尾的换行符/空格
- sys.stdin.read()会读取所有行,并合并为一个字符串,同样可以搭配.strip()使用
1. 读取单行键盘输入
1.1 普通数字
这里的注释先不看,是1.2嵌套字符串的注释说明;
# input_ = sys.stdin.read().strip() # 一次性读取多行内容并合并成一个字符串
# input_ = sys.stdin.readline() # 一次读取一行,会带上(首尾的)行结束符/行回车符
input_ = sys.stdin.readline().strip() # 删去首尾的空格符(一般都用这个)
# input_ = input() # (不建议)多行情况下很不方便,单行等效于sys.stdin.readline().strip()print(input_) # "abcde" | 'abcde' <这里实际上是'"abcde"',字符串显示是不显示外层的双引号 | 如果输入是'abcde',则实际上是"'abcde'">
print(repr(input_)) # 验证一下有没有嵌套字符串,
print(type(input_)) # str
# 平常我们以为英文单引号,双引号是一样的即.split('"')?=.split("'")), 其实不一样,内层的' or "才是split的分割字符
# 还有一个细节是split的对象是字符串的内层,也就是打印出来的我们看到的那一部分
# 最难崩的一点是如果split生效,结果会在外层再套上一层''(注意这里不管内层是''还是""最后都会套上'')
# 这里split生效指的是分割字符存在于字符串的内层,如'"abcde"'.split('"')就会生效,否则会返回只包含字符串整体(即包含外层)的列表
print(input_.split('"')) # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'")) # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))
右键run,键盘输入123,回车!
1.2 嵌套字符串
输入"abcde",回车:
输入'abcde',回车:
- 根据输入字符串中外层""或''的不同,以及split("'")与split('"')的不同,分割结果也不一样:
- 具体可以通过repr()函数进行验证,repr()函数显示字符串整体,
- 直接print会隐藏字符串外层的''或""
1.3 字符串+列表 (仍会在外层嵌套字符串)
输入"abcde",["a", "b", "c", "d", "e"],回车:
由两部分构成:
第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中间用英文,隔开
那么怎么读取"abcde",["a", "b", "c", "d", "e"]并得到"abcde"和["a", "b", "c", "d", "e"]两部分呢?
--核心思想是找到分隔符所在的位置,然后分离两部分,之后使用json.loads方法解析回列表:
# 从标准输入读取内容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割输入为两部分(字符串部分和列表部分)
# 找到第一个点是第一个逗号,确保只在列表内部
split_index = input_data.find(',')
print(repr(input_data[:split_index])) # '"abcde"'
str_part = input_data[:split_index].strip('"') # 提取字符串部分并去除引号
list_part_str = input_data[split_index+1:] # 提取列表部分的字符串# 将列表部分的字符串解析为Python列表
list_part = json.loads(list_part_str)# 输出结果及类型验证
print("字符串部分:", str_part)
print("字符串部分整体:", repr(str_part))
print("字符串部分类型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整体:", repr(list_part))
print("列表部分类型:", type(list_part))
输入"abcde",["a", "b", "c", "d", "e"],回车:
2. 读取多行键盘输入
一个算法经典示例:
题目:第一行是数据的组数,接下来每一行都有俩整数(空格隔开),求每一行俩整数和
输入:
3 1 1 2 2 3 3
输出:
真正示例的输出应该直接是:(因为键盘输入已经完全提前写入了)
2 4 6
最后给一下code,结合着注释着看应该回好一些~
- 1.1,1.2, 1.3
# 通过sys实现键盘输入读取
# 注意sys读取输入为字符串形式,即会在外面套上''
import sys
import json# 1. sys读取一/多行输入
# input_ = sys.stdin.read().strip() # 一次性读取多行内容并合并成一个字符串
# input_ = sys.stdin.readline() # 一次读取一行,会带上(首尾的)行结束符/行回车符
input_ = sys.stdin.readline().strip() # 删去首尾的空格符(一般都用这个)
# input_ = input() # (不建议)多行情况下很不方便,单行等效于sys.stdin.readline().strip()print(input_) # "abcde" | 'abcde' <这里实际上是'"abcde"',字符串显示是不显示外层的双引号 | 如果输入是'abcde',则实际上是"'abcde'">
print(repr(input_)) # 验证一下有没有嵌套字符串,
print(type(input_)) # str
# 平常我们以为英文单引号,双引号是一样的即.split('"')?=.split("'")), 其实不一样,内层的' or "才是split的分割字符
# 还有一个细节是split的对象是字符串的内层,也就是打印出来的我们看到的那一部分
# 最难崩的一点是如果split生效,结果会在外层再套上一层''(注意这里不管内层是''还是""最后都会套上'')
# 这里split生效指的是分割字符存在于字符串的内层,如'"abcde"'.split('"')就会生效,否则会返回只包含字符串整体(即包含外层)的列表
print(input_.split('"')) # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'")) # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))"""
--例1【数字】:
123
123 <这里实际上是'123',数据类型是str>
'123'
<class 'str'>
['123']
['123']
['123']--例2【嵌套字符串】:
"abcde" | 'abcde'
"abcde" <这里实际上是'"abcde"',字符串显示是不显示最外层的双引号> | <如果输入是'abcde',则实际上是"'abcde'">
<class 'str'>
'"abcde"' | "'abcde'"
['', 'abcde', ''] | ["'abcde'"]
['"abcde"'] | ['', 'abcde', '']
['"abcde"'] | ["'abcde'"]--例三【混合情况】:
由两部分构成,第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中间用英文,隔开
"abcde",["a", "b", "c", "d", "e"] <实际上是'"abcde",["a", "b", "c", "d", "e"]'>
'"abcde",["a", "b", "c", "d", "e"]'
<class 'str'>
['', 'abcde', ',[', 'a', ', ', 'b', ', ', 'c', ', ', 'd', ', ', 'e', ']']
['"abcde",["a", "b", "c", "d", "e"]'] <只包含字符串整体(即包含外层)的列表>
['"abcde"', '["a"', ' "b"', ' "c"', ' "d"', ' "e"]']
包含6个元素'"abcde"'和'["a"' 和 ' "b"' 和 ' "c"' 和 ' "d"' 和 ' "e"]' (这里是因为列表中的字符串元素也是用英文,分割的,且,后有空格)
"""
- 1.3解法
# 从标准输入读取内容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割输入为两部分(字符串部分和列表部分)
# 找到第一个点是第一个逗号,确保只在列表内部
split_index = input_data.find(',')
# print(repr(input_data[:split_index])) # '"abcde"'
str_part = input_data[:split_index].strip('"') # 提取字符串部分并去除引号
list_part_str = input_data[split_index+1:] # 提取列表部分的字符串# 将列表部分的字符串解析为Python列表
list_part = json.loads(list_part_str)# 输出结果及类型验证
print("字符串部分:", str_part)
print("字符串部分整体:", repr(str_part))
print("字符串部分类型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整体:", repr(list_part))
print("列表部分类型:", type(list_part))"""
字符串部分: abcde
字符串部分整体: 'abcde'
字符串部分类型: <class 'str'>
列表部分: ['a', 'b', 'c', 'd', 'e']
列表部分整体: ['a', 'b', 'c', 'd', 'e']
列表部分类型: <class 'list'>
"""
- 2
# 算法示例题(用sys读取多行输入)
# 题目:第一行是数据的组数,接下来每一行都有俩整数(空格隔开),求每一行俩整数和
n = int(sys.stdin.readline().strip()) # 得到第一行数据,即数据组数(下面一共有多少行)
for _ in range(n):pair = sys.stdin.readline().strip() # 开始读空格隔开的整数对num1, num2 = int(pair.split()[0]), int(pair.split()[1])print(num1 + num2)"""
--测试样例:
3
1 1
2 2
3 3--输出:
2
4
6
"""