Python 在列表中串联多个范围

Python 在列表中串联多个范围,python,Python,在python中,有没有一种方法可以创建一个跳过数字并在跳过之后继续的列表?类似于以下代码: x = [1...3, 6...10] print(x) # [1,2,3,6,7,8,9,10] 很容易编写for循环,然后跳过每个定义的索引/值,或者我可以只使用范围,我想要的是一个更短、可读性更强的行。如果没有,我可以理解。最简单的方法是调用并在列表分配中生成结果 x = [*range(1, 4), *range(6, 11)] 或者,您可以使用: 您可以将其转换为递归函数: def rec

在python中,有没有一种方法可以创建一个跳过数字并在跳过之后继续的列表?类似于以下代码:

x = [1...3, 6...10]
print(x)
# [1,2,3,6,7,8,9,10]

很容易编写for循环,然后跳过每个定义的索引/值,或者我可以只使用
范围
,我想要的是一个更短、可读性更强的行。如果没有,我可以理解。

最简单的方法是调用并在列表分配中生成结果

x = [*range(1, 4), *range(6, 11)]
或者,您可以使用:


您可以将其转换为递归函数:

def recursive_ranges(ranges):
    if len(ranges) == 1:
        return list(range(*ranges[0]))
    else:
        return list(range(*ranges[0])) + recursive_ranges(ranges[1:])
然后,您可以调用它,将范围指定为列表列表:

ranges = [[1, 4], [6, 11]]
recursive_ranges(ranges)
# [1, 2, 3, 6, 7, 8, 9, 10]
请注意,
*ranges[0]
用于将
ranges[0]
中的元素解压为单个参数。本质上,递归函数不断获取
范围
的第一个元素,其中每个元素都是一个两元素数组,并将这些数字作为两个不同的值(而不是一个数组)传递给
范围()
方法。这就是
*
所做的,它将数组解包。第一次调用,您将
[1,4]
解包到
范围(1,4)
中,然后将递归函数的下一次调用附加到该范围中

基本上可分为以下几部分:

list(range(1, 4)) + list(range(6, 11))

但是,您可以使用更紧凑的语法,只需传递列表列表。

如果
numpy
是一个选项,则可以使用来连接切片对象:

import numpy as np

np.r_[1:4, 6:11]
# array([ 1,  2,  3,  6,  7,  8,  9, 10])

这将是太长,更大的numbers@Led什么意思?另请参见我的递归函数更新。非常紧凑。谢谢,但是需要编写一个函数。顺便说一句,这是一个好主意。虽然这个方法有效,但值得注意的是,它在内存中创建了整个列表。如果只想在结果序列上迭代一次,那么这将比
itertools.chain
方法消耗更多内存。准确地说,在我的系统上,每个数字40字节。这对于小序列来说很好,但是如果序列有10亿个数字,那么就需要进行计算……Python不支持任何特殊的范围语法,更不用说在同一个列表文本中隐式连接这些语法了。
import numpy as np

np.r_[1:4, 6:11]
# array([ 1,  2,  3,  6,  7,  8,  9, 10])