【问题标题】:List manipulation and using STDIN列表操作和使用 STDIN
【发布时间】:2019-03-22 10:43:09
【问题描述】:

我正在互联网上研究这个示例,并试图理解代码。

例子说样本输入是

    12
    insert 0 5
    insert 1 10
    insert 0 6
    print 
    remove 6
    append 9
    append 1
    sort 
    print
    pop
    reverse
    print

通过应用此代码

L=[];
t=int(input());
for i in range(0,t):
    cmd=input().split();
    if cmd[0] == "insert":
        L.insert(int(cmd[1]),int(cmd[2]))
    elif cmd[0] == "append":
        L.append(int(cmd[1]))
    elif cmd[0] == "pop":
        L.pop();
    elif cmd[0] == "print":
        print L
    elif cmd[0] == "remove":
        L.remove(int(cmd[1]))
    elif cmd[0] == "sort":
        L.sort();
    else:
        L.reverse();

我应该得到类似这样的输出:

样本输出

[6, 5, 10]
[1, 5, 9, 10]
[9, 5, 1]

我拥有所有成分,但我无法弄清楚这一点。我的问题是我不知道我应该如何输入示例输入(即,以什么格式?)它是否必须作为列表或字符串输入..我真的不确定。请帮忙

非常感谢

【问题讨论】:

  • 你的代码在我这边运行良好。
  • 代码运行良好,但您是如何输入的?您是否只是复制并粘贴示例输入而没有放置括号或括号?
  • 我一一输入。我建议您传递 cmd = input("Enter input:").split() 之类的消息
  • 输入应在标准输入stdin 上输入。您可以在控制台中“按原样”运行代码(运行python my_script.py),然后在控制台提示符下逐行编写;或将输入写入文件(例如my_input.txt),然后以python my_script_py < my_input.txt 运行您的python 脚本。
  • 感谢您的回复。我会去做的。那么 for 循环的意义何在 'for i in range(0,t):' ?是检查单个输入的大小吗?

标签: python-3.x list stdout stdin


【解决方案1】:

要了解会发生什么,让我们逐段看一下代码。
首先,声明一个空列表。它将存储所有值

L=[];

然后,提示用户输入输入的大小,这个值(一个string)被转换(cast)成一个整数(int)。

t=int(input());

添加一些信息供用户阅读可能会更明确。

t=int(input('Please enter the size of your input\n'));

之后,程序将循环t 次。

for i in range(0,t):

在这个循环中,首先提示用户输入一个输入(这里是一个命令)。此输入被拆分:split() 函数将string 转换为称为cmd 的字符串列表(由空格分隔)。

    cmd=input().split();

同样,它可以更明确。

    cmd=input('Please enter a command\n').split();

现在,我们对命令进行'switch'(python中没有switch,所以它是一系列'if,else if,else if ...),并采取相应的行动。

    if cmd[0] == "insert":
        L.insert(int(cmd[1]),int(cmd[2]))
    elif cmd[0] == "append":
        L.append(int(cmd[1]))
    elif cmd[0] == "pop":
        L.pop();
    elif cmd[0] == "print":
        print L
    elif cmd[0] == "remove":
        L.remove(int(cmd[1]))
    elif cmd[0] == "sort":
        L.sort();
    else:
        L.reverse();

您现在可以看到为什么您的输入在第一行以12 开头,这是您的程序应该读取的行数,并将存储在t 中。如果它太小,例如6,您的程序将只读取前 6 个命令。如果它太大,例如42,你的程序将等待更多的输入,并停留在它的循环中。它看起来像是被卡住了,而实际上它只是在等待来自stdin 的一些输入。

当您的第一行输入为insert 0 5 时,为了回答您关于错误的最后一条评论,python 解释器试图将其转换为整数,并将其存储在t 中。由于它不能(insert 0 5 不是表示整数的字符串),它会崩溃。
您可以使用类似的 try .. except 构造来捕获此错误

while True:
    try:
        t=int(input('Please enter the size of your input\n'));
        break
    except ValueError:
        print('You must input an integer! Try again.')

【讨论】:

  • 非常感谢。先输入输入的大小,再输入输入。我远未猜到是这样的。老实说,python初学者不容易猜到。这个练习应该是为初学者准备的。换句话说,我需要输入 12 并同时输入一个输入,这在理论上应该会导致最终的“样本”输出。我试图这样做,但我没有得到与示例输出类似的结果,我一定是在某个地方出错了。再次非常感谢你
  • 所以你现在不仅了解了这个程序的工作方式,还了解了“Python 之禅”中的一句话:“显式优于隐式”。此外,在您不理解程序时查看程序行为的一种方法是在程序的各个点打印一些变量的值(在这里您将要打印L)。这可以帮助您了解其行为。这不是一种好的做法,但在您开始编写代码时会很有帮助。
  • 啊,还有最后一条建议。此代码是 Python 2 代码。 Python 2 将不会很快再维护(今年年底),所以我建议你开始学习 Python 3(这很不常见,但 python 不向后兼容)。作为 python 初学者,除了print 后面的括号外,你应该看不出任何区别,但你一定会学习到“正确”的语言版本。
  • 知道了,非常感谢您的耐心和努力。我很高兴 stackoverflow 提供了这个平台,让初学者和专家编码员见面并分享知识。谢谢楼主!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多