2012-03-02 48 views
2

我有一個列表大小N在列表中的每個元素是K-10之間的L
我想創建一個二維表SK行這樣r行包含所有這些指標i,這樣L[i] == r請告訴我做的最有效的Python的方式是:

例如,如果L[0, 0, 1, 3, 0, 3]
然後將新列表S[[0, 1, 4], [2], [], [3, 5]]

解當然應該O(N),它也應當儘可能(讀爲有效:在列表中沒有任何無用的追加操作)

+2

我認爲S的關係等於'[[0,1,4],[2],[],[3,5]]',我已經編輯你的問題,下跌自由滾回來,但我想這是隻是一個錯字或東西。 – Trufa 2012-03-02 06:49:07

回答

4
>>> L = [0, 0, 1, 3, 0, 3] 
>>> import collections 
>>> d = collections.defaultdict(list) 
>>> for index, item in enumerate(L): 
... d[item].append(index) 
... 
>>> d 
defaultdict(<type 'list'>, {0: [0, 1, 4], 1: [2], 3: [3, 5]}) 
>>> [d[i] for i in xrange(1 + max(d))] 
[[0, 1, 4], [2], [], [3, 5]] 
2
>>> L = [0, 0, 1, 3, 0, 3] 
>>> S = map(lambda x: [], L) 
>>> S 
[[], [], [], [], [], []] 
>>> for index, item in enumerate(L): 
    S[item].append(index) 


>>> S 
[[0, 1, 4], [2], [], [3, 5], [], []] 
>>> 

有了這個解決方案中,S0到所有索引用一個空的列表填充。

編輯:的確WIM是正確的,S[4]S[5]是不希望讓我重新使用WIM的xrange使所期望它的工作:

>>> L = [0, 0, 1, 3, 0, 3] 
>>> S = map(lambda x: [], xrange(1 + max(L))) 
... 
>>> S 
[[0, 1, 4], [2], [], [3, 5]] 
+0

這不是請求的輸出,雖然。 – wim 2012-03-02 14:45:36

1

這裏有一個簡單而有效的方式做到這一點:

K = 4 
S = [ [] for _ in range(K) ] 
for n, val in enumerate(L): 
    S[val].append(n) 
相關問題