我有一個列表大小N
在列表中的每個元素是K-1
0
之間的L
。
我想創建一個二維表S
與K
行這樣r
日行包含所有這些指標i
,這樣L[i] == r
。請告訴我做的最有效的Python的方式是:
例如,如果L
是[0, 0, 1, 3, 0, 3]
然後將新列表S
是[[0, 1, 4], [2], [], [3, 5]]
解當然應該O(N),它也應當儘可能(讀爲有效:在列表中沒有任何無用的追加操作)
我有一個列表大小N
在列表中的每個元素是K-1
0
之間的L
。
我想創建一個二維表S
與K
行這樣r
日行包含所有這些指標i
,這樣L[i] == r
。請告訴我做的最有效的Python的方式是:
例如,如果L
是[0, 0, 1, 3, 0, 3]
然後將新列表S
是[[0, 1, 4], [2], [], [3, 5]]
解當然應該O(N),它也應當儘可能(讀爲有效:在列表中沒有任何無用的追加操作)
>>> 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]]
>>> 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], [], []]
>>>
有了這個解決方案中,S
從0
到所有索引用一個空的列表填充。
編輯:的確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]]
這不是請求的輸出,雖然。 – wim 2012-03-02 14:45:36
這裏有一個簡單而有效的方式做到這一點:
K = 4
S = [ [] for _ in range(K) ]
for n, val in enumerate(L):
S[val].append(n)
我認爲S的關係等於'[[0,1,4],[2],[],[3,5]]',我已經編輯你的問題,下跌自由滾回來,但我想這是隻是一個錯字或東西。 – Trufa 2012-03-02 06:49:07