首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成器-使用两个生成器解析数字范围

生成器-使用两个生成器解析数字范围
EN

Stack Overflow用户
提问于 2022-02-26 08:06:48
回答 4查看 98关注 0票数 1

因此,我有一个string,它表示由'-‘分开的数字,我需要编写2个生成器,获取这个字符串,并返回每个数字的范围。例如,输入字符串'1-2,4-4,8-10'需要返回:

代码语言:javascript
复制
[1, 2, 4, 8, 9, 10]

因此,第一个生成器需要在每次迭代中返回数字列表(可以是字符串列表),所以这就是我所做的:

代码语言:javascript
复制
def parse_ranges(ranges_string):
    range_splitter = (n for n in ranges_string.split(','))
    print(next(range_splitter).split('-'))
    print(next(range_splitter).split('-'))
    print(next(range_splitter).split('-')) 

这份申报表:

代码语言:javascript
复制
['1', '2']
['4', '4']
['8', '10']

第二个生成器需要使用这个值,每次返回范围内存在的所有数字。

因此,目前我所尝试的是:

代码语言:javascript
复制
numbers = [int(n) for n in list]

这将返回数字列表(最小和最大),现在我需要将其转换为此范围内的数字。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-02-26 08:28:39

正如您所说的生成器,您至少需要使用yield

这是我认为你需要的两台发电机:

代码语言:javascript
复制
def singlerange(s):
    start, stop = map(int, s.split('-'))
    yield from range(start, stop + 1)

def multirange(s):
    for rng in s.split(','):
        yield from singlerange(rng)

示例运行:

代码语言:javascript
复制
s = '1-2,4-4,8-10'
print(*multirange(s))   # 1 2 4 8 9 10
票数 2
EN

Stack Overflow用户

发布于 2022-02-26 08:12:53

对于每一对start,end,您都需要在python range(start, end+1)中获得相应的范围[start,end]

代码语言:javascript
复制
def parse_ranges(ranges_string):
    result = []
    for str_range in ranges_string.split(','):
        start, end = str_range.split("-")
        result.extend(range(int(start), int(end) + 1))
    return result

s = '1-2,4-4,8-10'
x = parse_ranges(s)
print(x)  # [1, 2, 4, 8, 9, 10]
票数 1
EN

Stack Overflow用户

发布于 2022-02-26 08:34:31

因为你需要两台发电机。如果您想要找到存在于两个数字之间的所有数字,只需使用列表(range(start,end+1))。这将包括开始号和结束号。但是,这并不会检查重复的范围或有交叉数字的2个范围。但这是个起点

代码语言:javascript
复制
def stringRangetoNumberRange(stringRange):
    return [[int(j) for j in x.split('-')] for x in stringRange.split(',')]
    
def numberRangetoNumberList(numberRange):
    result = []
    
    for i in numberRange:
        result += list(range(i[0], i[1]+1))
    result.sort()
    return result
    
numberRange = stringRangetoNumberRange("1-2,4-4,8-10")
numberList = numberRangetoNumberList(numberRange)
print(numberList)

# [1, 2, 4, 8, 9, 10]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71275034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档