Python 在列表中串联多个范围
在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
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])