什么是最有效的pythonic方式:

时间:2012-03-02 06:28:43

标签: python

我有一个大小为L的列表N,其中列表的每个元素都在0K-1之间。
我想创建一个带有S行的2D列表K,以便r th 行包含所有这些索引i,这样{{1 }}。

例如L[i] == rL的情况 然后新列表[0, 0, 1, 3, 0, 3]S

解决方案当然应该是O(N),它应该尽可能高效(阅读:列表上没有无用的附加操作)

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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], [], []]
>>> 

使用此解决方案,S0K - 1的所有索引都会填入一个空列表。

编辑:确实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]]

答案 2 :(得分:1)

这是一种简单而有效的方法:

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