python-3.x 在处理多行输入时,需要额外的冗余新行来查看预期结果

jexiocij  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(104)

我试图阅读多行文本和打印它似乎是非常容易的工作,但有趣的是,我看到奇怪的行为

while True:

    client_input = ''
    print("Please enter your queries:")         # User input we'll be adding to
    for line in sys.stdin:   # Iterator loops over readline() for file-like object
        if line == '\n' or line=='':     # Got a line that was just a newline
            break            # Break out of the input loop
        client_input += line   # Keep adding input to variable
    print('cccccccccccccccc')
    print(client_input)

现在输入这个多行文本

{
        "xxxx": [
            {
                "zzzz": {
                    "zz": "a",
                    "eee": "d"
                }
            },
            {
                "qqq": {
                    "q": "a",
                    "a": "d"
                }
            }
        ]}

所以我希望当我输入一个新的行后,粘贴此文本看到cccccccccccccccc打印,但我需要点击回车两次,以查看预期的行为。任何人都可以帮助什么是额外的需要新的线路是和如何修复它?

m1m5dgzv

m1m5dgzv1#

你需要点击两次才能跳出循环,因为当你粘贴它时,你仍然在最后一个复制的行中:

]}

它既不是空的,也不是'\n'
所以第一个回车是向下进入一个新的行,第二个回车是一个新的行的输入,它打破了循环。

6bc51xsx

6bc51xsx2#

您输入的最后一行被程序视为:
]}\n
它既不是空的,也不是\n。这就是为什么你需要按两次回车键。
如果你想让你的输入在一次输入后就被接受,你必须检测行是否以\n结尾。然而,这将包括输入的所有行,从而违背了目的。
解决方法是跟踪client_input中的开括号和闭括号。对于任何左括号类型,增加一个计数器,对于任何右括号类型,减少相同的计数器。现在,如果在计数器为0时遇到\n,则所有输入都是有效的(左括号数==右括号数)。
下面是一个示例代码。

import sys

# gets the count of all opening brackets in a line
def get_open(line):
    return line.count("{") + line.count("[") + line.count("(")
    
# gets the count of all closing brackets in a line    
def get_close(line):
    return line.count("}") + line.count("]") + line.count(")")

while True:
    client_input = ''
    count = 0
    print("Please enter your queries:") 
    for line in sys.stdin:
        count += get_open(line) - get_close(line) # add opening and subtract closing
        if line == '' or (line[-1] == '\n' and count == 0):
            break
        client_input += line
    print('cccccccccccccccc')
    print(client_input)

注:这假设括号的功能相同。“{”也可以用“]”结束,因为我们只记录开始和结束括号的计数。如果你想正确地验证数据,可以使用堆栈。如果你想确保括号的有效性,请在LeetCode上检查这个问题。

相关问题