101
mylist = ["aa123", "bb2322", "aa354", "cc332", "ab334", "333aa"]

I need the index position of all items that contain 'aa'. I'm having trouble combining enumerate() with partial string matching. I'm not even sure if I should be using enumerate.

I just need to return the index positions: 0,2,5

Patrick Artner
  • 50,409
  • 9
  • 43
  • 69
L Shaw
  • 1,067
  • 2
  • 8
  • 7

5 Answers5

164

You can use enumerate inside a list-comprehension:

indices = [i for i, s in enumerate(mylist) if 'aa' in s]
Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
StoryTeller - Unslander Monica
  • 165,132
  • 21
  • 377
  • 458
24

Your idea to use enumerate() was correct.

indices = []
for i, elem in enumerate(mylist):
    if 'aa' in elem:
        indices.append(i)

Alternatively, as a list comprehension:

indices = [i for i, elem in enumerate(mylist) if 'aa' in elem]
pemistahl
  • 9,304
  • 8
  • 45
  • 75
  • How might the list comprehension get extended to instead of "if 'aa'" to be "if ["aa","bb"] in elem" ?? – GrantRWHumphries Apr 17 '18 at 12:46
  • @GrantRWHumphries You go one level lower with second for loop: `indices = [i for i, elem in enumerate(mylist) if any(a in elem for a in ["aa","bb"])]`. – Daniel Jan 29 '22 at 13:33
12

Without enumerate():

>>> mylist = ["aa123", "bb2322", "aa354", "cc332", "ab334", "333aa"]
>>> l = [mylist.index(i) for i in mylist if 'aa' in i]
>>> l
[0, 2, 5]
TerryA
  • 58,805
  • 11
  • 114
  • 143
2

Based on this answer, I'd like to show how to "early exit" the iteration once the first item containing the substring aa is encountered. This only returns the first position.

import itertools
first_idx = len(tuple(itertools.takewhile(lambda x: "aa" not in x, mylist)))

This should be much more performant than looping over the whole list when the list is large, since takewhile will stop once the condition is False for the first time.

I know that the question asked for all positions, but since there will be many users stumbling upon this question when searching for the first substring, I'll add this answer anyways.

JE_Muc
  • 5,403
  • 2
  • 26
  • 41
-4
spell_list = ["Tuesday", "Wednesday", "February", "November", "Annual", "Calendar", "Solstice"]

index=spell_list.index("Annual")
print(index)
Andronicus
  • 25,419
  • 17
  • 47
  • 88
  • 1
    This does not answer the question. A value error will be thrown when you use this method but only specifies list.index('an'). The method will be unable to find annual. – mastersom Nov 26 '19 at 11:37
  • 1
    Right. This is an incorrect answer to the question that has been asked. – Ombrophile May 19 '20 at 13:39