【问题标题】:How do I read the next integer ignoring whitespace in Python?如何读取 Python 中忽略空格的下一个整数?
【发布时间】:2013-10-22 08:09:04
【问题描述】:

如何读取 Python 3 中忽略空格的下一个整数?有没有办法制作一个从空格分隔的整数流中返回整数的生成器?

我拥有的最好的是:

def ints():
    while True:
        yield from (int(x) for x in input().split())

【问题讨论】:

标签: python input python-3.x


【解决方案1】:

完全忽略空白并从文件中读取(将整数纯粹视为连续数字):

import mmap
import re

with open('somefile', 'rb') as fin:
    mf = mmap.mmap(fin.fileno(), 0, access=mmap.ACCESS_READ)
    for digits in re.finditer('(\d+)', mf):
        print(digits.group(1))

或者,如果您已经将所有内容都保存在一个字符串中,则适当地调整 finditer,可能类似于:

yield from (match.group(1) for match in re.finditer('\d+', some_string))

【讨论】:

  • 我删除了我的尝试,因为我更喜欢这种方法。 +1
【解决方案2】:

如果你从标准输入读取,你可以这样做:

import sys

def ints():
    for line in sys.stdin:
        rtr=[int(d) for d in line.split() if d.isdigit()] 
        if rtr:
            for n in rtr:
                yield n

print(list(ints()))

或者,如果您的 Py 3.3+ 支持生成器委托:

import sys

def ints():
    for line in sys.stdin:
         yield from (int(d) for d in line.split() if d.isdigit())

您还可以使用非常简洁的fileinput,它的优点是支持文件名(然后将打开并读取该名称的文件)或来自重定向标准输入的输入:

import fileinput

def ints():
    for line in fileinput.input():
        yield from (int(d) for d in line.split() if d.isdigit())

(如果您直接或手动测试文件输入,请知道您需要以两个 CtlD 结束输入——而不仅仅是一个....)

【讨论】:

  • 我可能会选择iter(input, '')而不是while Truesys.stdin.readline()
  • @JonClements:我认为只使用for line in sys.stdin: 而不是While True 会更好。谢谢!
  • 我会在生成器表达式中将 []-s 替换为 ()-s。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 2014-10-04
  • 2016-04-19
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多