2012-12-19 33 views
9

我想要一個長列表,例如[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列表,而不是列出的名單(或任何最好的稱呼)。我猜這很容易,我很想念它,但經過相當多的搜索之後,我沒有提出任何有用的東西。有任何想法嗎?

回答

14

試試這個爲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)' –

2

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()

7

您可以使用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

謝謝,這絕對值得指出。將更新答案。 –

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] 
0

我想提出UA版本,而+

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