我有一个列表data
,我想返回一个字典,将data
的每个值映射到显示该值的索引列表。
这可以使用以下代码完成:
data = np.array(data)
{val: list(np.where(data==val)[0]) for val in data}
但是这在O(n ^ 2)中运行,对于长列表来说这太慢了。可以使用“pythonic”语法对O(n)解决方案进行编码吗? (可以通过创建一个空列表并在循环中更新它来完成,但我知道在python中不建议这样做。)
答案 0 :(得分:4)
您可以使用defaultdict
lists
在O(n)中实现此目的:
from collections import defaultdict
d = defaultdict(list)
for idx, item in enumerate(data):
d[item].append(idx)
例如,如果data
包含字符串'abcabccbazzzqa'
:
d = defaultdict(list)
for idx, item in enumerate('abcabccbazzzqa'):
d[item].append(idx)
>>> d
defaultdict(<type 'list'>, {'a': [0, 3, 8, 13], 'q': [12], 'c': [2, 5, 6], 'b': [1, 4, 7], 'z': [9, 10, 11]})
>>> d['a']
[0, 3, 8, 13]
答案 1 :(得分:1)
试试这个:
data = np.array(data)
dic = {}
for i, val in enumerate(data):
if val in dic.keys():
dic[val].append(i)
else:
dic[val]=[]
dic[val].append(i)