【发布时间】:2014-12-30 11:59:50
【问题描述】:
编辑: 我最终查找了我是“重复”问题的解决方案,并制作了以下 sn-p 代码:
import sys
from collections import deque
_input=deque([])
def read_word():
global _input
while len(_input)==0:
line=sys.stdin.readline().split()
for word in line:
_input.append(word)
return _input.popleft()
def read_int():
return int(read_word())
原始问题:
我想用 Python 编写一些从标准输入读取输入的程序。但是输入处理让我很生气——我没有看到一种很好的方法来扫描没有很好地对齐行的数据。 例如,如果我必须扫描一个整数 N,然后处理 N 个单词,在 C++ 中我会这样做:
int N;
char str[100];
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%s",str);
//do stuff with str
}
此程序将以完全相同的方式扫描以下所有输入:
//input 1:
3 word1 word2 word3
//input 2:
3
word1 word2 word3
//input 3:
3
word1
word2
word3
//input 4:
3 word1 word2
word3
我喜欢类似于 C 的 scanf 赋予我的灵活性,我也希望在 Python 中看到类似的东西。我不能使用 input(),因为它会尝试将字符串解析为 Python 语法(可能以字典或类似的东西结尾),并且 raw_input() 在换行符结束的行上运行。函数 sys.stdin.read() 也不好,因为它会等到给出整个输入(我可能想实时显示部分结果)。我看到实现这种功能性的唯一方法是在循环中使用 sys.stdin.readline() ,尝试独立解析每一行,直到解析所有需要的单词。但这不是很优雅的解决方案,它也有一些缺陷 - 例如,如果上面提到的示例程序在其进一步的操作中应该输入更多的东西,并且这个单词或数字与最后一个单词在同一行给出, Python 程序无法正确解析它。
有问题的输入是:
//input 5:
3 word1 word2
word3 next_input
“next_input”这个词会被 readline() 函数“吞下”,即使以后的程序可能需要它。同样,这可以通过提供 input_yet_to_be_parsed_but_already_inputted 的临时缓冲区来解决,但它很快就会变成非常错误的代码。有没有真正的“pythonic”方式来做到这一点?还是我遗漏了一些明显的东西?
【问题讨论】:
-
“在 C++ 中我会这样做”——那不是 C++……那是 C。
-
好的,但是在 C++ 中无论如何都有
cin>>a>>b;语法,它一次只扫描一个单词,所以问题仍然有效。