我有一个包含元素的列表,而其中一些元素可以重复。例如,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...
有人可以告诉我该怎么做?注意,代码应该尽可能通用。
答案 0 :(得分: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而不进行任何导入。但是,如果导入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]}
>>>
答案 1 :(得分: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]})
答案 2 :(得分: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]
答案 3 :(得分: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开始。
所以要获得索引+1,你可以这样做:
myIndexes = [i+1 for i,value in enumerate(list) if value == 1]
print myIndexs
[1,5,9]
答案 4 :(得分: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])