2

I want to take the indices of each element in the list a=[2,4,5,2] when I enter a.index(2) I get 0 as output. How can I take the index of the fourth element like that way in Python?

Taku
  • 31,927
  • 11
  • 74
  • 85
  • 2
    `a.index(2)` returns the index of the first `2` in `a`. Did you mean you want to access the element `4` (different from the fourth element)? That would simply be `a[1]` (python indexing starts at 0). Also try `[(i, x) in enumerate(a)]`. – pault Jan 27 '18 at 06:11
  • Well, there are 2 twos, so it gets the first one – whackamadoodle3000 Jan 27 '18 at 06:11
  • 2
    `index()` only gets the index of the first occurrence. Do you want all the indexes for each item? – RoadRunner Jan 27 '18 at 06:11

3 Answers3

2

You could recover all the indices like so

indices = [i for i in xrange(len(a)) if a[i] == 2]
Olivier Melançon
  • 21,584
  • 4
  • 41
  • 73
1

You could try this to get them all:

[print i for i,v in enumerate(a) if v==2] # or any number
whackamadoodle3000
  • 6,684
  • 4
  • 27
  • 44
1

You could also store the indexes for each item in a collections.defaultdict():

from collections import defaultdict

a=[2,4,5,2]

indexes = defaultdict(list)
for i, e in enumerate(a):
    indexes[e].append(i)

print(indexes)

Which gives:

defaultdict(<class 'list'>, {2: [0, 3], 4: [1], 5: [2]})

Then you could access the indexes for each item like this:

>>> indexes[2]
[0, 3]
>>> for i in indexes[2]:
...     print(i, '-->', a[i])
... 
0 --> 2
3 --> 2

Or as @Idlehands pointed out in the comments, you can use dict.setdefault() here:

indexes = {}
for i, e in enumerate(a):
    indexes.setdefault(e, []).append(i)

print(indexes)

Which also gives:

{2: [0, 3], 4: [1], 5: [2]}
RoadRunner
  • 25,803
  • 6
  • 42
  • 75
  • You can also do this with the `built-in dict`. `indexes.setdefault(e, list()).append(i)` would work just the same. – r.ook Jan 27 '18 at 06:39
  • @Idlehands Yep that would work just as great. Even more efficient: `indexes.setdefault(e, []).append(i)`. I believe using `[]` is less costly than `list()`, I could be mistaken though. – RoadRunner Jan 27 '18 at 06:53