2013-12-23 58 views
1

我試圖創建使用如何編寫列表理解來創建列表?

>>> [set(i) for i in range(9)] 

[set([0]), set([1]), set([2]),..]列表,但它沒有出來很好

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
TypeError: 'int' object is not iterable 

如何創建一個列表理解該列表?可能嗎?

+7

'set(i)'不像'set([0])'。你能看到區別麼? –

+0

我可以問你爲什麼試圖創建有一個元素的集合列表,只是爲了練習列表理解或你已經使用的情況下? –

+0

@yopy:我正在使用它來爲[Kruskal最小生成樹](http://en.wikipedia.org/wiki/Kruskal%27s_algorithm)的實現構建子樹。初始化創建包含一個元素的n個子樹(集合)。有沒有更好的辦法? – embert

回答

5

要與列表理解創建[set([0]), set([1]), set([2]),..]你可以使用:

>>> [{i} for i in range(5)] 
[set([0]), set([1]), set([2]), set([3]), set([4])] 

除非你使用任何版本的Python 2.7之前的版本,然後使用:

>>> [set((i,)) for i in range(5)] 
[set([0]), set([1]), set([2]), set([3]), set([4])] 

然而,似乎有種愚蠢的是,你正在創建一個集合列表,其中每個集合是一個遞增序列的單個整數。無論你試圖完成什麼,都可能以更好的方式完成,請參考The XY Problem,並確保你不會陷入這個問題。

根據您要完成的內容,可能有更好的方法來存儲您的數據或執行您嘗試執行的邏輯。

注:

本來我寫[set([i]) for i in range(5)]但定時不同的選項之後,我意識到整數轉換成一個單一的項目列表是比它轉換成一個元組更浪費,所以我改變了我的答案,然後再次更改它以使用設置的文字,時間如下:

>python -mtimeit "[{i} for i in range(5)]" 
1000000 loops, best of 3: 0.853 usec per loop 

>python -mtimeit "[set((i,)) for i in range(5)]" 
1000000 loops, best of 3: 1.64 usec per loop 

>python -mtimeit "[set([i]) for i in range(5)]" 
1000000 loops, best of 3: 1.87 usec per loop 
+3

除非OP使用的是一個非常古老的Python,'[{i} for i in range(5)]'也應該工作。 – DSM

+0

'[{i}因爲我在範圍內(5)]'我會接受 – embert

+1

感謝您提出有關XY問題的建議 – embert