将列表中所有元素的出现次数转换为字典的最快方法是什么?
例如:
A = [ 1, 2, 3, 4 , 2, 1 ]
我想建立:
B['1'] = [0, 5]
B['2'] = [1, 4]
B['3'] = [2]
B['4'] = [3]
这是为了避免在循环中多次调用np.where,这对于大A来说太慢了。理想情况下,只想遍历数组A一次。 例如,要避免:
uniqA = np.unique(A)
for i in uniqA:
B[str(i)] = np.argwhere(i==A)
答案 0 :(得分:0)
你只能迭代一次:
>>> from collections import defaultdict
>>> A = [ 1, 2, 3, 4 , 2, 1 ]
>>> d = defaultdict(list)
>>> for i,x in enumerate(A):
... d[x].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: [0, 5], 2: [1, 4], 3: [2], 4: [3]})
答案 1 :(得分:0)
这样的事情应该有效。
from collections import defaultdict
d = defaultdict(list)
for i, val in enumerate(A):
d[val].append(i)
答案 2 :(得分:0)
我认为不需要defaultdict
- 不确定这是否比这种做法更好?
B={}
for i,x in enumerate(A):
B[x]=B.get(x,[]) + [i]
结果:
{1: [0, 5], 2: [1, 4], 3: [2], 4: [3]}