请告诉我做的最有效的Python的方式是:
问题描述:
我有一个列表大小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]]
+0
这不是请求的输出,虽然。 – 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