Как найти все индексы символа в строке

I got some simple code:

def find(str, ch):
    for ltr in str:
        if ltr == ch:
            return str.index(ltr)
find("ooottat", "o")

The function only return the first index. If I change return to print, it will print 0 0 0. Why is this and is there any way to get 0 1 2?

Paradox's user avatar

Paradox

73812 silver badges30 bronze badges

asked Jun 20, 2012 at 14:55

William Xing's user avatar

3

This is because str.index(ch) will return the index where ch occurs the first time. Try:

def find(s, ch):
    return [i for i, ltr in enumerate(s) if ltr == ch]

This will return a list of all indexes you need.

P.S. Hugh’s answer shows a generator function (it makes a difference if the list of indexes can get large). This function can also be adjusted by changing [] to ().

answered Jun 20, 2012 at 14:58

Lev Levitsky's user avatar

Lev LevitskyLev Levitsky

63k20 gold badges146 silver badges175 bronze badges

3

I would go with Lev, but it’s worth pointing out that if you end up with more complex searches that using re.finditer may be worth bearing in mind (but re’s often cause more trouble than worth – but sometimes handy to know)

test = "ooottat"
[ (i.start(), i.end()) for i in re.finditer('o', test)]
# [(0, 1), (1, 2), (2, 3)]

[ (i.start(), i.end()) for i in re.finditer('o+', test)]
# [(0, 3)]

answered Jun 20, 2012 at 15:19

Jon Clements's user avatar

Jon ClementsJon Clements

138k32 gold badges244 silver badges278 bronze badges

Lev’s answer is the one I’d use, however here’s something based on your original code:

def find(str, ch):
    for i, ltr in enumerate(str):
        if ltr == ch:
            yield i

>>> list(find("ooottat", "o"))
[0, 1, 2]

Community's user avatar

answered Jun 20, 2012 at 15:04

Mark Ransom's user avatar

Mark RansomMark Ransom

298k40 gold badges391 silver badges618 bronze badges

def find_offsets(haystack, needle):
    """
    Find the start of all (possibly-overlapping) instances of needle in haystack
    """
    offs = -1
    while True:
        offs = haystack.find(needle, offs+1)
        if offs == -1:
            break
        else:
            yield offs

for offs in find_offsets("ooottat", "o"):
    print offs

results in

0
1
2

answered Jun 20, 2012 at 15:01

Hugh Bothwell's user avatar

Hugh BothwellHugh Bothwell

54.9k8 gold badges84 silver badges99 bronze badges

def find_idx(str, ch):
    yield [i for i, c in enumerate(str) if c == ch]

for idx in find_idx('babak karchini is a beginner in python ', 'i'):
    print(idx)

output:

[11, 13, 15, 23, 29]

answered Sep 19, 2020 at 15:44

Babak Karchini's user avatar

Get all the position in just one line

word = 'Hello'
to_find = 'l'

# in one line
print([i for i, x in enumerate(word) if x == to_find])

answered Jun 3, 2021 at 15:05

Darkstar Dream's user avatar

Darkstar DreamDarkstar Dream

1,5811 gold badge11 silver badges22 bronze badges

0

As the rule of thumb, NumPy arrays often outperform other solutions while working with POD, Plain Old Data. A string is an example of POD and a character too. To find all the indices of only one char in a string, NumPy ndarrays may be the fastest way:

def find1(str, ch):
  # 0.100 seconds for 1MB str 
  npbuf = np.frombuffer(str, dtype=np.uint8) # Reinterpret str as a char buffer
  return np.where(npbuf == ord(ch))          # Find indices with numpy

def find2(str, ch):
  # 0.920 seconds for 1MB str 
  return [i for i, c in enumerate(str) if c == ch] # Find indices with python

answered Feb 21, 2020 at 11:22

Anton K's user avatar

Anton KAnton K

4,6202 gold badges47 silver badges59 bronze badges

x = "abcdabcdabcd"
print(x)
l = -1
while True:
    l = x.find("a", l+1)
    if l == -1:
        break
    print(l)

Azat Ibrakov's user avatar

Azat Ibrakov

9,7259 gold badges37 silver badges49 bronze badges

answered Aug 23, 2018 at 9:37

Arvind Kumar's user avatar

2

This is slightly modified version of Mark Ransom’s answer that works if ch could be more than one character in length.

def find(term, ch):
    """Find all places with ch in str
    """
    for i in range(len(term)):
        if term[i:i + len(ch)] == ch:
            yield i

answered Apr 8, 2020 at 0:09

dashesy's user avatar

dashesydashesy

2,5583 gold badges44 silver badges61 bronze badges

All the other answers have two main flaws:

  1. They do a Python loop through the string, which is horrifically slow, or
  2. They use numpy which is a pretty big additional dependency.
def findall(haystack, needle):
    idx = -1
    while True:
        idx = haystack.find(needle, idx+1)
        if idx == -1:
            break
        yield idx

This iterates through haystack looking for needle, always starting at where the previous iteration ended. It uses the builtin str.find which is much faster than iterating through haystack character-by-character. It doesn’t require any new imports.

answered Sep 9, 2020 at 18:00

Jonathan's user avatar

JonathanJonathan

1,82417 silver badges26 bronze badges

2

To embellish the five-star one-liner posted by @Lev and @Darkstar:

word = 'Hello'
to_find = 'l'
print(", ".join([str(i) for i, x in enumerate(word) if x == to_find]))

This just makes the separation of index numbers more obvious.
Result will be: 2, 3

answered Jul 19, 2021 at 22:15

Dr. C.'s user avatar

You could try this

def find(ch,string1):
    for i in range(len(string1)):
        if ch == string1[i]:
            pos.append(i)        

aizaz's user avatar

aizaz

3,0489 gold badges25 silver badges57 bronze badges

answered May 3, 2013 at 7:13

user2179861's user avatar

One approach could be to build a dictionary, iterating over the distinct letters in the string and using re.finditer to obtain the index of all occurrences in the string. So going step by step:

import re
a = 'string of letters'

We can find the unique letters in the string by taking a set:

letters = set(a.replace(' ',''))
# {'e', 'f', 'g', 'i', 'l', 'n', 'o', 'r', 's', 't'}

Then we could use a dictionary comprehension to build the dictionary, in which the the values are a list generated by iterating over all match instances returned by re.finditer:

{w: [m.start() for m in re.finditer(w, a)] for w in letters}

{'i': [3],
 'o': [7],
 'f': [8],
 'l': [10],
 'g': [5],
 'e': [11, 14],
 't': [1, 12, 13],
 's': [0, 16],
 'n': [4],
 'r': [2, 15]}

В этом посте будет обсуждаться, как найти индексы всех вхождений символа в строку в Java.

1. Использование indexOf() а также lastIndexOf() метод

Класс String предоставляет indexOf() метод, который возвращает индекс первого появления символа в строке.

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        char ch = ‘,’;

        int index = str.indexOf(ch);

        System.out.println(index);            // 1

    }

}

Скачать  Выполнить код

 
Чтобы получить индексы всех вхождений символа в строку, вы можете неоднократно вызывать метод indexOf() метод внутри цикла. В следующем примере показано, как использовать indexOf() метод эффективно, когда поиск следующего индекса начинается с предыдущего индекса.

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        char ch = ‘,’;

        int index = str.indexOf(ch);

        while (index != 1) {

            System.out.println(index);

            index = str.indexOf(ch, index + 1);

        }

    }

}

Скачать  Выполнить код

результат:

1
6
12
16

 
Или еще короче:

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        char ch = ‘,’;

        int index = 1;

        while ((index = str.indexOf(ch, index + 1)) != 1) {

            System.out.println(index);

        }

    }

}

Скачать  Выполнить код

результат:

1
6
12
16

 
Если вам просто нужен индекс последнего появления символа в строке, используйте lastIndexOf() метод.

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        char ch = ‘,’;

        int lastIndex = str.lastIndexOf(ch);

        System.out.println(lastIndex);            // 16

    }

}

Скачать  Выполнить код

2. Использование IntStream.iterate() метод

В Java 9 вы можете использовать IntStream.iterate(seed, hasNext, next) метод, который возвращает последовательный упорядоченный IntStream производится с применением next функция к начальному элементу seed, при условии выполнения hasNext предикат. Ниже приведен простой пример, демонстрирующий использование этого:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        char ch = ‘,’;

        List<Integer> indices = IntStream.iterate(str.indexOf(ch), i -> i != 1,

                                                i -> str.indexOf(ch, i + 1))

                                    .boxed().collect(Collectors.toList());

        System.out.println(indices);

    }

}

Скачать  Выполнить код

результат:

[1, 6, 12, 16]

3. Использование регулярных выражений

Чтобы получить индексы всех появлений символа в строке, вы также можете использовать регулярное выражение. Идея состоит в том, чтобы создать сопоставитель для сопоставления строки для указанного символа. Вот как будет выглядеть код:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Main

{

    public static void main(String[] args)

    {

        String str = “C, C++, Java, C#, Kotlin”;

        String ch = “,”;

        Matcher matcher = Pattern.compile(ch).matcher(str);

        while (matcher.find()) {

            System.out.println(matcher.start());

        }

    }

}

Скачать  Выполнить код

результат:

1
6
12
16

Вот и все, что касается поиска индексов всех вхождений символа в строку в Java.

Строки представляют собой набор символов. Каждый символ в строке занимает определенную позицию, т.е имеет свой индекс. Зная этот индекс, мы можем получить доступ к тому или иному символу. В этой статье мы рассмотрим, как найти индекс символа в строке.

Как найти индекс символа в строке при помощи функции find()

Функция find() возвращает позицию подстроки. Мы также можем указать начальную и конечную позиции, между которыми хотим искать (по умолчанию поиск происходит от начала до конца строки).

В следующем коде мы используем эту функцию для поиска позиции символа в строке.

s = 'python is fun'
c = 'n'
print(s.find(c))

# 5

Обратите внимание, что функция возвращает позицию символа, идущего в строке первым. То есть мы получили индекс символа “n” из слова “python”, а не из слова “fun”. Также следует помнить, что функция find() возвращает -1, если заданная подстрока отсутствует в строке.

Использование функции rfind()

Эта функция аналогична функции find(), с той лишь разницей, что она возвращает последнюю позицию, на которой расположена искомая подстрока. Например:

s = 'python is fun'
c = 'n'
print(s.rfind(c))

#12

Как найти индекс символа в строке при помощи функции index()

Функция index() тоже позволяет найти индекс подстроки в строке. Как и find(), она возвращает первое вхождение искомого символа в строке. Например:

s = 'python is fun'
c = 'n'
print(s.index(c))

# 5

Разница между функциями index() и find() заключается в том, что функция index() возвращает ValueError, если в строке отсутствует нужный символ.

Использование цикла for для поиска позиции символа в строке

При таком подходе мы перебираем символы строки в цикле и сравниваем каждый символ с искомым. Каждая позиция, по которой найдено совпадение, отмечается и сохраняется в отдельной переменной.

Следующий код реализует эту логику.

s = 'python is fun'
c = 'n'
lst = []
for pos,char in enumerate(s):
    if(char == c):
        lst.append(pos)
print(lst)

#[5, 12]

Мы используем функцию enumerate(), поскольку она упрощает итерацию и присваивает переменную счетчика каждому символу строки.

Это также можно реализовать с помощью list comprehension, что считается более быстрым и чистым решением. Например:

s = 'python is fun'
c = 'n'
print([pos for pos, char in enumerate(s) if char == c])

# [5, 12]

Перевод статьи Manav Narula «Find Character in a String in Python».

0 / 0 / 0

Регистрация: 17.09.2018

Сообщений: 68

1

Найти все позиции символа в строке

27.02.2019, 15:51. Показов 19503. Ответов 4


Студворк — интернет-сервис помощи студентам

Написать функцию определяющую все позиции символа в строке. На вход подается строка и символ, который ищем. Программа должна выводить все позиции символа в строке.
Пример входных данных:
drobox
o
Пример выходных данных:
2 4



0



SergeyDe

49 / 21 / 6

Регистрация: 16.02.2019

Сообщений: 55

27.02.2019, 16:01

2

Python
1
2
3
4
5
src_str = "dropbox"
sym = "o"
 
result = list(filter(lambda x: x >= 0, 
    map(lambda char, pos: pos if char in sym else -1 , src_str, range( 0, len(src_str)))))

[2,5]



1



Andrey B

170 / 122 / 61

Регистрация: 06.02.2015

Сообщений: 300

27.02.2019, 16:05

3

Не по питоновски что-ли

Python
1
2
3
4
5
6
stroka=input('Введите строку ')
symb=input('Введите символ для поиска ')
 
for i in range(len(stroka)):
    if stroka[i]==symb:
        print(i)



0



__ALPHA__

298 / 156 / 87

Регистрация: 16.04.2018

Сообщений: 239

27.02.2019, 16:07

4

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Предложу такое решение:

Python
1
2
3
4
5
6
text = input()
char = input()
 
indexs = [i for i, symb in enumerate(text) if symb==char]
 
print(indexs)

Кстати, в приведенном примере ошибка, там должно быть 2 5, а не 2 4.



1



170 / 122 / 61

Регистрация: 06.02.2015

Сообщений: 300

27.02.2019, 16:07

5

1. Опечатка в ‘a’
2. Индексация+ 1 элемент в вашем примере
3. Так код рабочий



0



Добавить комментарий