以pythonic方式获取列表的每个值的索引列表

时间:2016-10-06 11:49:43

标签: python numpy

我有一个列表data,我想返回一个字典,将data的每个值映射到显示该值的索引列表。

这可以使用以下代码完成:

data = np.array(data)
{val: list(np.where(data==val)[0]) for val in data}

但是这在O(n ^ 2)中运行,对于长列表来说这太慢了。可以使用“pythonic”语法对O(n)解决方案进行编码吗? (可以通过创建一个空列表并在循环中更新它来完成,但我知道在python中不建议这样做。)

2 个答案:

答案 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)