当前位置: 首页 > 知识库问答 >
问题:

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

子车高超
2023-03-14

我有以下代码,其中我尝试将范围的字符串表示转换为数字列表。例如,如果输入为“0-0,3-5,7-10”,则预期输出为“0,3,4,5,7,8,9,10”。但是,我在以下位置出错:

for l,h in r.split('-') 

它说没有足够的值来解压。我的推理是,r应该具有'x-y'的形式,所以如果我将其拆分为'-',我应该得到两个值。有什么问题吗?

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')

共有3个答案

寇甫
2023-03-14

如果您的目标是将该格式的字符串解析为int列表,那么使用正则表达式来解析它可能是值得的

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')

输出:

['0', '5', '8', '10', '11', '13']

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

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'))

输出:

[0, 5, 8, 10, 11, 13]
公孙弘深
2023-03-14

intspan模块就是这样做的。

import intspan
s =  '0-0,3-5,7-10'

>>> list(intspan.intspan(s))
[0, 3, 4, 5, 7, 8, 9, 10]
殳越
2023-03-14

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

>>> [x for r in s.split(',') for x in r.split('-')]
['0', '0', '3', '5', '7', '10']

使用其中一个保持数字成对:

>>> [r.split('-') for r in s.split(',')]
[['0', '0'], ['3', '5'], ['7', '10']]

然后,在第二次理解中,您可以将前两个循环组合在一起,方法是将l和h拆包到位。

return (x
        for l,h in g
        for x in range(int(l), int(h)+1)
        )
 类似资料:
  • Quartz 的Cron任务调度表达式一般人很难理解,在Googole上查询也没有发现类似的代码,所以开发了一个对Quartz Cron 表达式的可视化双向解析和生成的一个java的GUI程序,供使用Quartz的程序员参考和使用,源代码放在SourceForge网站

  • 问题内容: 在这里看到讨论之后:Python-产生时差,我很好奇。我最初还以为生成器比列表快,但是当涉及sorted()时我不知道。将生成器表达式发送到sorted()而不是列表有什么好处吗?生成器表达式最终是否仍要在sorted()内放入列表中? 编辑:我只能接受一个答案让我感到悲伤,因为我感到很多答复都有助于澄清这个问题。再次感谢大家。 问题答案: 首先要做的是将数据转换为列表。基本上,实现的

  • 问题内容: 在Python中,通过 生成器表达式 创建生成器对象与使用 yield 语句之间有什么区别吗? 使用 yield : 使用 生成器表达式 : 这两个函数都返回生成器对象,这些对象生成元组,例如(0,0),(0,1)等。 一个或另一个有什么优势吗?有什么想法吗? 谢谢大家!这些答案中有很多不错的信息和进一步的参考! 问题答案: 两者之间只有细微的差别。您可以使用该模块自己检查这种事情。

  • 本文向大家介绍python 中的列表生成式、生成器表达式、模块导入,包括了python 中的列表生成式、生成器表达式、模块导入的使用技巧和注意事项,需要的朋友参考一下 5.16 列表生成式 5.17 列表生成式与生成器表达式的应用 第六章模块 什么是模块? 模块就是一系统功能的集合体,在python中,一个py文件就是一个模块,比如module.py,其中模块名module 6.1 import

  • 问题内容: 谁能帮助我了解为什么以下Python脚本会返回? 我想这与零长度实体有关,但不能完全理解。 问题答案: 除非 序列中存在元素, 否则 始终返回。 您的循环产生0个项目,因此返回。 这是记录: 返回如果的所有元素 迭代 是真实的( 或者,如果可迭代为空 )。 强调我的。 同样,将始终返回, 除非 序列中的元素为,所以对于空序列,将返回默认值:

  • 问题内容: 这个问题已经在这里有了答案 : 生成器表达式使用生成器创建后分配的列表 (5个答案) 去年关闭。 我正在运行一段代码,该代码在程序的某个部分意外出了逻辑错误。在研究本节时,我创建了一个测试文件来测试正在运行的语句集,并发现了一个看起来很奇怪的异常错误。 我测试了以下简单代码: 输出为: 是的,什么都没有。我期望过滤器理解能获得2中的项并输出,但是我没有得到: 当我注释掉第三行再次对其进