【问题标题】:How to take user input when it is seperated by any number of spaces and line breaks in python?当用户输入被python中的任意数量的空格和换行符分隔时,如何获取用户输入?
【发布时间】:2023-03-29 15:22:01
【问题描述】:

我一直在尝试采用由任意数量的空格或换行符分隔的整数输入。我知道如何使用空格分隔的输出和具有换行符的输出。在基于 C 的语言中,我们不必关心输入的位置,它会在找到时自动获取输入,但我认为 Python 不是这种情况(如果我错了,请纠正我)。有人可以帮忙吗?

我尝试使用 While 语句直到 True 并在其中使用 try 语句。但它不起作用。

a = []
try:
    while(True):
        a.append(int(input()))
except:
    pass
print(a) 

当我输入 12 12 12 它返回一个空列表。如果我删除输入中的 int,它会返回一个列表 [12 12, 12]

【问题讨论】:

  • 您的预期输出是什么?
  • 那么,您希望它持续接受输入,但前提是它是一个 int?

标签: python-3.x input python-3.6


【解决方案1】:

试试这个:最短的方法

a = []
s=input()

while s != '':  
    i = s.split()       
    [a.append(int(j)) for j in i]
    s=input()

print(a)

输入:

1 2 3
4 5
6

输出:

[1, 2, 3, 4, 5, 6]

你也可以试试:

a = []
s=input()

while s != '':  
    i = s.split()       
    a.extend(map(lambda s: int(s),i))
    s=input()

print(a)

【讨论】:

  • 这很有效,特别适用于整数。我刚刚意识到我一直在尝试制作一个可以接受任何输入的东西,当 OP 明确表示它是用于整数时。我觉得自己像个笨蛋。
  • 是的,我专门将输入数字转换为整数,我认为这就是你想要的
  • 这就是他们想要的。我是第一个回答者,我花了一个小时的大部分时间进行头脑风暴,以弄清楚如何也支持字符串。
  • 如果这是您想要的,请接受答案? @MegaEmailman :)
  • 对不起,我不是 OP。那将是@T.P.
【解决方案2】:

等等,我想我现在明白了。您想接受任意数量的输入,但将每个用空格分隔的输入保存为自己的条目?实际上有一个字符串方法。这是它的示例脚本。这不是最好的,但它很好地展示了该方法。

list = []
string = "user input goes here"
splitString = string.split()
for word in splitString:
    list.append(word)
print(list)

输出:

["user", "input", "goes", "here"]

string.split() 方法默认使用空格,但您可以指定另一个分隔符,如# 符号。

List = []
String = "Hi#my#name#is#bob"
newString = String.split("#")
for word in newString:
    list.append(word)

编辑:这是一个完整的工作实现,无论分隔两个输入的内容是空格、换行符还是您想要的任何其他内容,它都可以工作。

import re
list = []
while True:
    string = input()
    if string == "break":
        break
    splitString = re.split("[\s | \r\n]", string)
    for word in splitString:
        list.append(word)
    cleanList = []
    for word in list:
        if word != '':
            cleanList.append(word)
print(cleanList)

输入:

12 94 17
56
3

输出:

[12, 94, 17, 56, 3]

功能证明:点击here

【讨论】:

  • 我知道你要去哪里。但是 string.split("\r\n") 也会让它在换行符之后接受输入。
  • 是的,cmets 不能有换行符。这很粗糙。
  • 我认为这段代码将只接受一行中的输入,但不接受下一行的输入(即涉及换行符)。如果我的输入是这样的 ;12 3 (next line) 32 12 (next line) 3.;此代码将仅接受 12 和 3 并将它们附加到列表中,并且只需在下一行中输入。谢谢
  • 如果您愿意,我可以编辑我的答案以获得完整的工作实施?
  • 感谢您的回复,但在您的代码的第 4 行中,splitString 已经是字符串列表(因为 split 方法),split 方法不能用于字符串,因此它显示第 5 行出错,错误语句为:'''list' object has no attribute 'split'''
【解决方案3】:

希望您对这个示例有所了解,并添加了我对如何编码的个人看法。

首先,多空格输入是可以理解的,但多行不行。更喜欢一一输入。

出于测试和调试目的,最好分别收集用户和处理输入数据。

现在,假设您已经收集了用户输入并使用raw_input 存储为数据,这在您需要收集多行输入时非常方便。请探索raw_input,它在Python3和Python2中都支持。

>>>
>>> data = '''12
...
... 12       12
...
...
... 12'''
>>> data
'12 \n\n12       12\n\n\n12'
>>> print(data)
12

12       12


12

step1:清除所有分行

>>> double_spaces = '  '
>>> single_space = ' ' 
>>> data = data.strip().replace('\n', single_space)
>>> data
'12   12       12   12'

step2:修复多个空格

>>> while double_spaces in data:
...     data = data.replace(double_spaces, single_space)
...
>>> data
'12 12 12 12'
>>> print(list(map(int, data.split()))
...
... )
[12, 12, 12, 12]
>>>

你的代码有问题

>>> a = []
>>> try:
...     while(True):
...         a.append(int(input()))
... except:
...     pass
...
12
1
12  12
>>> a
[12, 1]
>>>

当您输入12 12 时,应该会发生以下情况。

>>> int('12 12')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12 12'

由于此代码有错误的异常处理 except:,因此您的用例将按预期返回一个空列表。

由于我更改了输入,您会看到这种差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多