Jak mogę uzyskać pozycję znaku w ciągu znaków w pythonie?
Jak mogę uzyskać pozycję znaku w ciągu znaków w pythonie?
Odpowiedzi:
Są do tego dwie metody łańcuchowe find()
i index()
. Różnica między nimi polega na tym, co się dzieje, gdy nie można znaleźć szukanego ciągu. find()
zwraca -1
i index()
podnosi ValueError
.
find()
>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1
index()
>>> myString = 'Position of a character'
>>> myString.index('s')
2
>>> myString.index('x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
string.find(s, sub[, start[, end]])
Powrót najniższą indeks s gdzie podciąg sub znajduje się tak, że sub jest całkowicie zawarty ws[start:end]
. Zwrot-1
w przypadku awarii. Domyślne wartości początku i końca oraz interpretacja wartości ujemnych są takie same jak dla wycinków.
I:
string.index(s, sub[, start[, end]])
Podobnie jakfind()
podniesienie,ValueError
gdy nie znaleziono podciągu.
Dla kompletności, jeśli chcesz znaleźć wszystkie pozycje znaku w ciągu, możesz wykonać następujące czynności:
s = 'shak#spea#e'
c = '#'
print [pos for pos, char in enumerate(s) if char == c]
który wróci [4, 9]
print( [pos for pos, char in enumerate(s) if char == c])
foo = ( [pos for pos, char in enumerate(s) if char == c])
umieści współrzędne foo w formacie listy. Uważam to za bardzo pomocne
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4
„Long Winded” Way
>>> for i,c in enumerate(s):
... if "r"==c: print i
...
4
uzyskać podciąg,
>>> s="mystring"
>>> s[4:10]
'ring'
str[from:to]
gdzie from
i gdzie to
są indeksy
Na zakończenie, w przypadku, gdy chcę znaleźć rozszerzenie w nazwie pliku, aby to sprawdzić, muszę znaleźć ostatnie „.”, W tym przypadku użyj rfind:
path = 'toto.titi.tata..xls'
path.find('.')
4
path.rfind('.')
15
w moim przypadku używam następującego, który działa niezależnie od pełnej nazwy pliku:
filename_without_extension = complete_name[:complete_name.rfind('.')]
left = q.find("{"); right = q.rfind("}")
.
Co dzieje się, gdy ciąg zawiera zduplikowany znak? z mojego doświadczenia z index()
zobaczyłem, że za duplikat otrzymujesz ten sam indeks.
Na przykład:
s = 'abccde'
for c in s:
print('%s, %d' % (c, s.index(c)))
wróciłby:
a, 0
b, 1
c, 2
c, 2
d, 4
W takim przypadku możesz zrobić coś takiego:
for i, character in enumerate(my_string):
# i is the position of the character in the string
enumerate
jest lepszy do tego rodzaju rzeczy.
string.find(character)
string.index(character)
Być może chciałbyś rzucić okiem na dokumentację, aby dowiedzieć się, jaka jest różnica między nimi.
Znak może pojawić się wiele razy w ciągu. Na przykład w łańcuchu sentence
pozycja e
wynosi 1, 4, 7
(ponieważ indeksowanie zwykle zaczyna się od zera). ale znalazłem obie funkcje find()
i index()
zwraca pierwszą pozycję znaku. Można to rozwiązać, wykonując następujące czynności:
def charposition(string, char):
pos = [] #list to store positions for each 'char' in 'string'
for n in range(len(string)):
if string[n] == char:
pos.append(n)
return pos
s = "sentence"
print(charposition(s, 'e'))
#Output: [1, 4, 7]
more_itertools.locate
to narzędzie innej firmy, które znajduje wszystkie oznaki pozycji spełniających warunek.
Tutaj znajdujemy wszystkie lokalizacje indeksu litery "i"
.
import more_itertools as mit
s = "supercalifragilisticexpialidocious"
list(mit.locate(s, lambda x: x == "i"))
# [8, 13, 15, 18, 23, 26, 30]
Rozwiązanie z numpy zapewniające szybki dostęp do wszystkich indeksów:
string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')