首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我使用生成器表达式有什么问题?

我使用生成器表达式有什么问题?
EN

Stack Overflow用户
提问于 2019-07-07 22:26:51
回答 4查看 98关注 0票数 1

我有以下代码,其中我尝试将范围的字符串表示形式转换为数字列表。例如,如果输入为'0-0,3-5,7-10',则期望输出为[0,3,4,5,7,8,9,10]。但是,我在以下方面有一个错误:

代码语言:javascript
运行
复制
for l,h in r.split('-') 

上面写着没有足够的价值来解开。我的推理是,r应该有表单'x-y',所以如果我将它除以'-',我应该得到两个值。这有什么问题吗?

代码语言:javascript
运行
复制
def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    g = (
        (l,h)
        for r in ranges.split(',')
        for l,h in r.split('-')
        )
    return (x
            for range_tuple in g
            for l,h in range_tuple
            for x in range(int(l), int(h)+1)
            )

parse_ranges('0-5,8-10,11-13')
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-07 22:32:46

你的循环太多了。因为您试图将这两个数字放在一起,所以不需要第二个嵌套循环。第二种方法是使结果变平:

代码语言:javascript
运行
复制
>>> [x for r in s.split(',') for x in r.split('-')]
['0', '0', '3', '5', '7', '10']

用一个来保持数字成对:

代码语言:javascript
运行
复制
>>> [r.split('-') for r in s.split(',')]
[['0', '0'], ['3', '5'], ['7', '10']]

然后,通过第二次理解,您可以将前两个for循环组合在一起,方法是打开lh

代码语言:javascript
运行
复制
return (x
        for l,h in g
        for x in range(int(l), int(h)+1)
        )
票数 1
EN

Stack Overflow用户

发布于 2019-07-07 22:37:59

intspan模块就是这样做的。

代码语言:javascript
运行
复制
import intspan
s =  '0-0,3-5,7-10'

>>> list(intspan.intspan(s))
[0, 3, 4, 5, 7, 8, 9, 10]
票数 1
EN

Stack Overflow用户

发布于 2019-07-07 22:34:00

如果您的目标是将具有该格式的字符串解析为一个it列表,那么使用regex解析它可能是值得的。

代码语言:javascript
运行
复制
def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    return re.split(',|-', ranges)

parse_ranges('0-5,8-10,11-13')

产出:

代码语言:javascript
运行
复制
['0', '5', '8', '10', '11', '13']

要将它们作为ints,而不是字符串,您可以执行以下操作:

代码语言:javascript
运行
复制
def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    return (int(x) for x in re.split(',|-', ranges))

list(parse_ranges('0-5,8-10,11-13'))

产出:

代码语言:javascript
运行
复制
[0, 5, 8, 10, 11, 13]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56926573

复制
相关文章

相似问题

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