【问题标题】:How to read "n" lines at a time from stdin?如何从标准输入一次读取“n”行?
【发布时间】:2020-02-25 00:17:00
【问题描述】:

考虑标准输入有以下条目:

2  
a     
b     
3
d   
e   
f   

现在我想先用n= sys.stdin.readline()读取号码 然后使用函数ReadNLines(n) 将接下来的n 行读入列表中。

所以预期的输出是:

List1 = ['a','b']  
List2 = ['d','e','f']

这是我尝试过的。我正在寻找更好的计时性能。

import sys
def ReadNLines(n):
    List =[]
    for line in range(n):
        List.append(sys.stdin.readline())
    return List

if __name__ == "__main__":
    n = sys.stdin.readline()
    List1 = ReadNLines(n)
    n = sys.stdin.readline()
    List2 = ReadNLines(n)

【问题讨论】:

  • “这可能吗?”我会这样想。你试过什么?
  • 您是否遇到任何错误?你能告诉我们你的尝试吗?
  • 为什么使用sys.stdin.readline() 而不是input()
  • 读取一行,将其转换为整数。然后循环读取接下来的n 行。
  • 仅供参考,readlines(n) 不会读取 n 行。它读取n 字节,然后将其拆分为行。

标签: python stdin readline readlines


【解决方案1】:

我认为这是你想要的:

import sys

def read_n_lines(n):
    return [sys.stdin.readline().rstrip() for _ in range(n)]

if __name__ == "__main__":
    count = 0
    while True:
        n = sys.stdin.readline().rstrip()
        if not n:  # Blank line entered?
            break  # Quit.
        n = int(n)
        result = read_n_lines(n)
        count += 1
        print(f'List{count} = {result}')
    print('done')

示例运行——按下 Enter 键以结束每一行输入:

2
a
b
List1 = ['a', 'b']
3
d
e
f
List2 = ['d', 'e', 'f']

done

【讨论】:

    【解决方案2】:

    您需要删除sys.stdin.readline() 在结果中包含的换行符。并且您需要将n 转换为整数。

    import sys
    def ReadNLines(n):
        List =[]
        for _ in range(n):
            List.append(sys.stdin.readline().strip())
    
    if __name__ == "__main__":
        n = int(sys.stdin.readline().strip())
        ReadNLines(n)
        n = int(sys.stdin.readline().strip())
        ReadNLines(n)
    

    由于您从不使用line 变量,因此约定是使用_ 作为虚拟变量。您还可以将函数转换为列表推导:

    def readNLines(n):
        return [sys.stdin.readline().strip() for _ in range(n)]
    

    【讨论】:

    • 是的,我明白了。但我希望有比调用 sys.stdin.readline n 次更好的计时性能。
    • 您为什么认为这是性能问题?我想不出任何其他方法。
    • 您可以使用sys.stdin.read(),然后调用splitlines(),但这会读取所有标准输入,而不仅仅是指定的行数。
    • 我想知道是否有其他方法可以花费更少的时间。
    • 我理解您所说的“更好的计时性能”是什么意思。我什么都想不出来。首先,您需要在担心时间安排之前使其正确。
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2010-11-29
    相关资源
    最近更新 更多