我知道的Python列表包含条目1
,2
和7
,例如,
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
数组可能很长,因此效率很重要。我如何实现这一目标?
答案 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))