2012-07-14 132 views
69

我正在嘗試使用其中的數字1-1000作出列表。很顯然,這將會令人討厭寫/閱讀,所以我試圖用範圍來製作一個列表。在Python 2似乎是:Python 3將範圍轉到列表

some_list = range(1,1000) 

會工作,但在Python 3的範圍是類似的Python 2的xrange

任何人都可以提供一些見解?

+4

只是不,爲什麼你實際上需要從1到1000的1000個數字的合約清單?使用範圍,只要你需要這樣的清單。 – 2012-07-14 00:46:49

+0

也有'some_list [i] == i + 1',所以你可能並不需要列表。 – njzk2 2014-06-06 15:45:47

+0

@RikPoggi。例如,可能需要爲繪圖功能提供一個列表。有時候一個範圍就足夠了,但是一個範圍不能被連接(是不可變的),所以如果你需要爲所有被繪製的列表添加一個默認的起始值,那麼這個值也需要變成一個列表。 – SherylHohman 2017-04-14 13:40:42

回答

4

你真的不應該需要在列表中使用數字1-1000。但是,如果由於某種原因,你真的需要這些數字,那麼你可以做:

[i for i in range(1, 1001)] 

列表綜合概括地說:

上面所列內容理解翻譯爲:

nums = [] 
for i in range(1, 1001): 
    nums.append(i) 

這是隻是列表理解的語法,雖然從2.x.我知道這將在python 3中工作,但我不確定是否還有升級的語法

範圍開始包含第一個參數;但最終要,不包括第二個參數(如果提供2個參數;如果第一個參數都不放過,它會在「0」開頭)

range(start, end+1) 
[start, start+1, .., end] 
+9

爲什麼理解?只是:'列表(範圍(1000))' – 2012-07-14 00:48:44

+0

謝謝!你介意解釋爲什麼它是我在我...而不是簡單地爲我在? – Boathouse 2012-07-14 00:50:13

+0

我還沒有用過python3。所以我不完全肯定它是如何工作的。我知道理解會起作用,但並非100%投射。但是,如果施法有效,那麼你是對的,你的方式更加pythonic。 – inspectorG4dget 2012-07-14 00:51:22

92

您可以直接構建在一個列表範圍對象:

my_list=list(range(1,1001)) 

這就是你如何使用python2.x中的生成器來做到這一點。通常來說,您可能不需要列表,因爲您可以更有效地得到my_list[i]的值(i+1),如果您只需要遍歷它,則可以回退到range

另請注意,在python2.x上,xrange仍可編入索引。這意味着,range上python3.x也具有同樣的性質

print xrange(30)[12]作品python2.x

中類似的語句來向python3.x 是print(range(30)[12]),這也適用。

+3

這肯定是要走的路,但挑剔:這是不是一個真正的「演員」 – jterrace 2012-07-14 01:03:08

+0

@jterrace改爲「投」到「轉換」。你是對的,不是演員......我真的不知道該怎麼稱呼它。 – mgilson 2012-07-14 01:21:44

+1

我會說「構造」或「構建」(或可能「具體化」) - 因爲您不是將生成器「轉換」爲一個列表,而是從數據源創建一個新的列表對象,恰好是一個發電機...(但s'pose只是分裂頭髮,並不是100%肯定我贊成什麼) – 2012-07-14 06:10:09

2

其實,如果你想1-1000(含),使用range(...)功能與參數1和1001:range(1, 1001),因爲range(start, end)功能去從開始到(結束-1),包容性。

14

在Python 3.x中,range()函數有它自己的類型。所以在這種情況下,你必須使用迭代器

list(range(1000))

+3

「在這種情況下,你必須使用迭代器」?這應該是什麼意思? – user2357112 2017-11-02 23:56:09

5

在蟒蛇< = 3。4您可以像其他人所建議的那樣,使用list(range(10))來使列表超出一個範圍(一般來說,任何可迭代的)。

另一種選擇,在Python 3.5其拆包概括介紹,是由文字列表[]使用*

>>> r = range(10) 
>>> l = [*r] 
>>> print(l) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

雖然這是相當於list(r),它的字面語法和事實,沒有函數調用所涉及的是讓它更快地執行。這也是更少的字符,如果你需要:-)

+2

爲了清楚起見,你仍然可以單行:'[* range(10)]'適用於當你不需要'範圍'用於任何目的而是初始化'list'時。附註:我最喜歡的(可以,不是真正的)解包概括的一部分是空的'set's現在有一個字面語法,'{*()}',或者我稱之爲單眼猴子操作符。 ;-) – ShadowRanger 2017-11-03 00:08:57

+0

@ShadowRanger這就是我最初的想法。爲了不使新的Python用戶感到困惑,我決定稍微詳細一點:-) – 2017-11-03 00:12:10

0

事實上代碼高爾夫,這是因爲相比於Python2 Python3的復古漸變。當然,使用range()和xrange()的Python2比分別使用list(range())和range()的Python3更方便。原因是因爲Python3的原始設計者並不是很有經驗,他們只考慮許多初學者使用範圍函數來迭代大量元素,因爲它既是內存又是CPU效率低下;但他們忽略了使用範圍函數來產生一個數字列表。現在,他們已經很晚了。

如果我是Python3的設計師,我會:

  1. 使用irange返回序列迭代器
  2. 使用lrange返回序列表
  3. 使用範圍返回一個序列迭代器(如果元件的數目是大的,例如,範圍(9999999)或序列列表(如果元件的數目是小的,例如,範圍(10))

這應該是最佳的。