我有一个大小为L
的列表N
,其中列表的每个元素都在0
到K-1
之间。
我想创建一个带有S
行的2D列表K
,以便r
th 行包含所有这些索引i
,这样{{1 }}。
例如L[i] == r
是L
的情况
然后新列表[0, 0, 1, 3, 0, 3]
为S
解决方案当然应该是O(N),它应该尽可能高效(阅读:列表上没有无用的附加操作)
答案 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], [], []]
>>>
使用此解决方案,S
从0
到K - 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)