按条目分隔列表

时间:2015-11-09 14:00:31

标签: python list

我知道的Python列表包含条目127,例如,

data = [1, 7, 2, 1, 1, 1, 2, 2, 7, 1, 7, 7, 2]

我现在想得到每个条目的所有索引,即

g1 = [0, 3, 4, 5, 9]
g2 = [2, 6, 7, 12]
g7 = [1, 8, 10, 11]

data数组可能很长,因此效率很重要。我如何实现这一目标?

4 个答案:

答案 0 :(得分:4)

您可以使用defaultdict来收集每组元素的索引:

In [1]: from collections import defaultdict

In [2]: data = [1, 7, 2, 1, 1, 1, 2, 2, 7, 1, 7, 7, 2]

In [3]: indices = defaultdict(list)

In [4]: for i, d in enumerate(data):
   ...:     indices[d].append(i)
   ...:     

In [5]: indices
Out[5]: defaultdict(<class 'list'>, {1: [0, 3, 4, 5, 9], 2: [2, 6, 7, 12], 7: [1, 8, 10, 11]})

答案 1 :(得分:1)

虽然werkzeug并不适合这项工作,但它会很好用:

from werkzeug import MultiDict

data = [1, 7, 2, 1, 1, 1, 2, 2, 7, 1, 7, 7, 2]

g = MultiDict((v, i) for i, v in enumerate(data))
g1 = g.getlist(1)
g2 = g.getlist(2)
g7 = g.getlist(7)

print repr(g7)
# [1, 8, 10, 11]

答案 2 :(得分:0)

这样的动态怎么样?

data = [1, 7, 2, 1, 1, 1, 2, 2, 7, 1, 7, 7, 2]
index_dict = {}

for i in range(len(data)):

  # Get or create the entry for the value
  sub_dict = index_dict.setdefault(val, [])

  # Add the index for the value
  sub_dict.append(i)

此代码将为其遇到的每个值创建一个条目并存储它的索引。然后,您可以查找字典以了解每个值的索引。

虽然这段代码不如列表理解那么优雅,但它的优点是只迭代数据一次。

答案 3 :(得分:-1)

您可以使用itertools.compress

data = [1, 7, 2, 1, 1, 1, 2, 2, 7, 1, 7, 7, 2]

g1 = itertools.compress(range(len(data)),  map(lambda x: x==1, data))
g2 = itertools.compress(range(len(data)),  map(lambda x: x==2, data))
g7 = itertools.compress(range(len(data)),  map(lambda x: x==7, data))