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
73812 silver badges30 bronze badges
asked Jun 20, 2012 at 14:55
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 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 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]
answered Jun 20, 2012 at 15:04
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 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
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 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 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
9,7259 gold badges37 silver badges49 bronze badges
answered Aug 23, 2018 at 9:37
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
dashesydashesy
2,5583 gold badges44 silver badges61 bronze badges
All the other answers have two main flaws:
- They do a Python loop through the string, which is horrifically slow, or
- 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
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
You could try this
def find(ch,string1):
for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
aizaz
3,0489 gold badges25 silver badges57 bronze badges
answered May 3, 2013 at 7:13
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
Написать функцию определяющую все позиции символа в строке. На вход подается строка и символ, который ищем. Программа должна выводить все позиции символа в строке.
0 |
SergeyDe 49 / 21 / 6 Регистрация: 16.02.2019 Сообщений: 55 |
||||
27.02.2019, 16:01 |
2 |
|||
[2,5]
1 |
Andrey B 170 / 122 / 61 Регистрация: 06.02.2015 Сообщений: 300 |
||||
27.02.2019, 16:05 |
3 |
|||
Не по питоновски что-ли
0 |
__ALPHA__ 298 / 156 / 87 Регистрация: 16.04.2018 Сообщений: 239 |
||||
27.02.2019, 16:07 |
4 |
|||
Сообщение было отмечено mik-a-el как решение РешениеПредложу такое решение:
Кстати, в приведенном примере ошибка, там должно быть 2 5, а не 2 4.
1 |
170 / 122 / 61 Регистрация: 06.02.2015 Сообщений: 300 |
|
27.02.2019, 16:07 |
5 |
1. Опечатка в ‘a’
0 |