1

我有一个包含元素的列表,而其中一些元素可以重复。例如,a = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]。我想找到所有这些元素的索引。输出应该是这样的:For element 1, indices are [1, 5, 9]. For element 2, indices are [2, 6, 10] etc...

有人可以告诉我该怎么做吗?请注意,代码应尽可能通用。

4

5 回答 5

3

这是一个非常通用的方法:

>>> lst = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
>>> dct = {x:[] for x in lst}
>>> for x,y in enumerate(lst, 1):
...     dct[y].append(x)
...
>>> dct
{1: [1, 5, 9], 2: [2, 6, 10], 3: [3, 7, 11], 4: [4, 8, 12]}
>>>

但是请注意,Python 索引从 0 开始,因此 1 的列表应该[0, 4, 8]2 的列表[1, 5, 9],等等。但是,由于您希望索引为 +1,所以我设置enumerate为从 1 开始。


上述解决方案使用纯 Python,没有任何导入。但是,如果您 import collections.defaultdict,您可以提高性能:

>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> for x,y in enumerate(lst, 1):
...     dct[y].append(x)
...
>>> dct
{1: [1, 5, 9], 2: [2, 6, 10], 3: [3, 7, 11], 4: [4, 8, 12]}
>>>
于 2013-10-23T14:00:21.777 回答
2

只要项目是可散列的,那么:

from collections import defaultdict

data = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
dd = defaultdict(list)
for idx, item in enumerate(data):
    dd[item].append(idx)

# defaultdict(<type 'list'>, {1: [0, 4, 8], 2: [1, 5, 9], 3: [2, 6, 10], 4: [3, 7, 11]})
于 2013-10-23T14:20:35.797 回答
1

你可以尝试使用这样的东西:

def get_indexes(my_array, item):
    return [i for i, e in enumerate(my_array) if e == item]

使用您的示例之一:

>>> print get_indexes([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], 2)
[1, 5, 9]
于 2013-10-23T14:00:29.180 回答
1

使用枚举的简单示例

list = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]    

myIndexes = [i for i,value in enumerate(list) if value == 1]

print myIndexs

[0, 4, 8]

在你的例子中,你说:

对于元素 1,索引为 [1, 5, 9]

你实际上想要索引 + 1!注意!列表从 0 开始。

所以要获得 index + 1 你可以这样做:

myIndexes = [i+1 for i,value in enumerate(list) if value == 1]

print myIndexs

[1, 5, 9]

于 2013-10-23T14:00:31.947 回答
0

numpy可以用于这样的事情:

>>>> import numpy as np
>>> a
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
>>> np.where(np.array(a) == 1)[0]
array([0, 4, 8])
于 2013-10-23T14:09:45.290 回答