使用多个范围语句的Python列表初始化

问题描述:

我想要一个长列表,例如[1,2,3,4,5,15,16,17,18,19]。初始化此,我尝试打字:使用多个范围语句的Python列表初始化

new_list = [range(1,6),range(15,20)] 

然而,这并不做我想做的,返回:

[[1, 2, 3, 4, 5], [15, 16, 17, 18, 19]] 

当我这样做:

len(new_list) 

它返回2,而不是我想要的10个元素之一(因为它在列表中列出了2个列表)。很显然,在这个例子中,我可以只输入了我想要的东西,但我想一些奇怪的迭代名单能像这样做:

new_list = [range(101,6284),8001,8003,8010,range(10000,12322)] 

渴望看到一个1-d列表,而不是列出的名单(或任何最好的称呼)。我猜这很容易,我很想念它,但经过相当多的搜索之后,我没有提出任何有用的东西。有任何想法吗?

试试这个为Python 2.x的:

range(1,6) + range(15,20) 

或者,如果你使用Python3.x,试试这个:

list(range(1,6)) + list(range(15,20)) 

对于之间-,包含元素处理的Python 2.x的:

range(101,6284) + [8001,8003,8010] + range(10000,12322) 

最后与之间的元素处理,为Python 3.x的:

list(range(101,6284)) + [8001,8003,8010] + list(range(10000,12322)) 

的关键环节要记住的是,在Python 2.x的range返回一个列表,并在Python 3 .x它返回一个迭代(所以它需要显式转换为一个列表)。并且为了将列表附加在一起,您可以使用+运算符。

+0

+1非常简单高效的代码,不知道你可以做的只是添加列表在一起! :D – jackcogdill

+0

有没有简单的方法可以在一行之间插入单个数字?我猜我可以追加每一个,但是在列表语句之间很少有零星的间隔,感谢您的帮助。 – jackd

+0

@jackd更新了我的答案。只需将它们打包在单元素列表中,如下所示:'range(1,3)+ [3​​] + range(4,6)' –

range返回一个列表开始,因此您需要将它们连接在一起+或使用append()extend()

new_list = range(1,6) + range(15,20) 

new_list = range(101,6284) 
mew_list.extend([8001,8003,8010]) 
mew_list.extend(range(10000,12322)) 

或者,你如图肖恩·奇的回答可以用itertools.chain()

您可以使用itertools.chain来调整range()调用的输出。

import itertools 
new_list = list(itertools.chain(xrange(1,6), xrange(15,20))) 

使用xrange(或简称为range() python3)获得一个迭代和链接在一起意味着只有一个列表对象被创建(无需中间的列表)。

如果你需要插入中间值,只是包括链列表/元组:

new_list = list(itertools.chain((-3,-1), 
           xrange(1,6), 
           tuple(7), # make single element iterable 
           xrange(15,20))) 
+0

+1此方法适用于python2相同.x和3.x – twneale

+1

要包含单个值,请确保它是迭代中的单个项目,例如'元组(8001)'或'[8001]'或'列表(8001)',否则会加上'8','0','0'和'1'。 – kreativitea

+0

谢谢,这绝对值得指出。将更新答案。 –

试试这个:

from itertools import chain 

new_list = [x for x in chain(range(1,6), range(15,20))] 
print new_list 

输出像你想:

 
[1, 2, 3, 4, 5, 15, 16, 17, 18, 19] 

我想提出UA版本,而+

import operator 
a = list(range(1,6)) 
b = list(range(7,9)) 
print(operator.concat(a,b))