使用多个范围语句的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它返回一个迭代(所以它需要显式转换为一个列表)。并且为了将列表附加在一起,您可以使用+
运算符。
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)))
+1此方法适用于python2相同.x和3.x – twneale
要包含单个值,请确保它是迭代中的单个项目,例如'元组(8001)'或'[8001]'或'列表(8001)',否则会加上'8','0','0'和'1'。 – kreativitea
谢谢,这绝对值得指出。将更新答案。 –
试试这个:
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))
+1非常简单高效的代码,不知道你可以做的只是添加列表在一起! :D – jackcogdill
有没有简单的方法可以在一行之间插入单个数字?我猜我可以追加每一个,但是在列表语句之间很少有零星的间隔,感谢您的帮助。 – jackd
@jackd更新了我的答案。只需将它们打包在单元素列表中,如下所示:'range(1,3)+ [3] + range(4,6)' –