代码之家  ›  专栏  ›  技术社区  ›  Sanjay Manohar

组合python中的范围列表

  •  1
  • Sanjay Manohar  · 技术社区  · 2 年前

    构造给定范围内连续整数列表的最简单方法是什么?

    [1,2,3,4,5,6,7,  15,16,17,18,19,  56,57,58,59]
    

    我知道每组的起始值和结束值。 我试过了:

    ranges = (  range(1,8),
                range(15,20),
                range(56,60)  )
    Y = sum( [ list(x) for x in  ranges ] )
    

    这是有效的,但看起来像是一口。就代码的易读性而言 sum() 只是令人困惑。在MATLAB中,它只是

    Y = [ 1:7, 15:19, 56:59 ]
    

    有更好的方法吗?可以使用 numpy 如果更容易的话。

    奖金问题

    有人能解释为什么如果我用发电机 sum ?

    Y = sum( (list(x) for x in ranges) )
    

    TypeError:不支持+的操作数类型:“int”和“list”

    似乎不知道起始值应该是 [] 而不是 0 !

    5 回复  |  直到 2 年前
        1
  •  4
  •   mozway    2 年前

    matlab语法在中具有等效性 具有 numpy.r_ :

    import numpy as np
    
    np.r_[1:7, 15:19, 56:59]
    

    输出 array([ 1, 2, 3, 4, 5, 6, 15, 16, 17, 18, 56, 57, 58])

    对于列表:

    np.r_[1:7, 15:19, 56:59].tolist()
    

    输出 [1, 2, 3, 4, 5, 6, 15, 16, 17, 18, 56, 57, 58]

        2
  •  4
  •   fsimonjetz    2 年前

    一种选择,可能是最接近Matlab语法的选择,是使用星形运算符:

    >>> [*range(1,8), *range(15,20), *range(56, 60)]
    [1, 2, 3, 4, 5, 6, 7, 15, 16, 17, 18, 19, 56, 57, 58, 59]
    
        3
  •  2
  •   user3468054    2 年前

    你可以使用itertool's chain.from_iterable ,它从单个interable惰性地评估参数:

    >>> list(itertools.chain.from_iterable((range(1,8), range(15,20), range(56,60))))
    [1, 2, 3, 4, 5, 6, 7, 15, 16, 17, 18, 19, 56, 57, 58, 59]
    
        4
  •  2
  •   blhsing    2 年前

    使用修复代码 sum ,可以指定一个空列表作为 start 关键字参数作为聚合的起点:

    sum((list(x) for x in ranges), start=[])
    
        5
  •  1
  •   AKX Bryan Oakley    2 年前

    您可以编写自己的生成器助手函数:

    def ranges(*argses):
        for args in argses:
            yield from range(*args)
    
    
    for x in ranges((1, 7), (15, 19), (56, 59)):
        print(x)
    

    如果你需要一个多范围的实际列表,那么 list(ranges(...)) .