2012-03-02 44 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) 
相关问题