0

I recently got a project in which I need to find all of the indices where a specific character appeared in a string inputted by the user. For example the user inputs the string "This is a test" and I wanted to find the indices of all the t's in the string I would get 0, 11, 14 I looked through the built in commands and couldn't find anything so it would be a real help to know a method to find this.

Kevin
  • 2,112
  • 14
  • 15

2 Answers2

2

Use enumerate and a list comprehension:

st="This is a test"

print([i for i, c in enumerate(st) if c.lower()=='t'])

Or:

print([i for i, c in enumerate(st) if c in 'tT'])

In either case, prints:

[0, 10, 13]

Explanation

First thing that 'makes this work' is that strings are iterable in Python:

>>> st="This is a test"
>>> for c in st:
...    print c
... 
T
h
i
s

i
s

a

t
e
s
t

Second thing that makes this work is enumerate which adds a count of all the characters in the string as a tuple:

>>> for tup in enumerate(st):
...    print tup
... 
(0, 'T')
(1, 'h')
(2, 'i')
(3, 's')
(4, ' ')
(5, 'i')
(6, 's')
(7, ' ')
(8, 'a')
(9, ' ')
(10, 't')
(11, 'e')
(12, 's')
(13, 't')

Pulling those two concepts together into a list comprehension produces the result:

[i for i, c in enumerate(st) if c.lower()=='t']
                 ^^^                               Produces the tuple of index and character
       ^  ^                                        Index, Character
                                  ^^^^^^^^^^^      test the character if it is 't'
 ^                                                 What is wanted - list of indices
dawg
  • 98,345
  • 23
  • 131
  • 206
  • Thank you this works, can you just explain why it works, I would like to understand the workings behind the code – user3277658 Feb 08 '14 at 17:59
0

Just a straightforward approach as an alternative to a (better) enumerate option:

[range(len(st))[i] for i in range(len(st)) if st[i].lower() == 't']
sashkello
  • 17,306
  • 24
  • 81
  • 109