Jak uzyskać pozycję postaci w Pythonie?

526

Jak mogę uzyskać pozycję znaku w ciągu znaków w pythonie?

użytkownik244470
źródło

Odpowiedzi:

696

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.

Za pomocą find()

>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1

Za pomocą 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

Z podręcznika Python

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 w s[start:end]. Zwrot -1w 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 jak find()podniesienie, ValueErrorgdy nie znaleziono podciągu.

Eli Bendersky
źródło
127

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]

Salvador Dali
źródło
4
W python3 pojawia się błąd składniowy - jak to zmienić?
Sean
19
@Sean: instrukcja print została usunięta. Pozostaje tylko formularz funkcji. Irytujące, ale odpowiedź brzmi: po prostu zmień tę ostatnią linię na: print( [pos for pos, char in enumerate(s) if char == c])
The Nate
3
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
3nrique0
jest zindeksowany 0, 0123 w przeciwieństwie do 1234, więc rzeczywista pozycja to 5, 10
3kstc
czy to tak szybko, jak to możliwe? jeśli ktoś użyłby np. tablic, czy mógłby wystąpić wzrost wydajności dla długich str?
Seb
49
>>> 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'
ghostdog74
źródło
1
Dzięki Powiedz mi, w jaki sposób możemy uzyskać podciąg łańcucha zgodnie z podanymi pozycjami ...
user244470
1
@arung: aby uzyskać podciąg, użyj krojenia: str[from:to]gdzie fromi gdzie tosą indeksy
Eli Bendersky
s.find () zwraca -1, jeśli nie znaleziono podłańcucha
Evgenii,
s.search () podnosi błąd ValueError, gdy nie znaleziono podłańcucha. s.find () zwraca -1, jeśli nie znaleziono podłańcucha.
Praxiteles
16

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('.')]
A.Joly
źródło
Jest to pomocne w znalezieniu zasięgu ciągu. Na przykład, znalezienie słownika mogą być: left = q.find("{"); right = q.rfind("}").
ximiki,
15

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
DimSarak
źródło
enumeratejest lepszy do tego rodzaju rzeczy.
o11c
10
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.

John Machin
źródło
Z tej połączonej dokumentacji: s.search () wywołuje błąd ValueError, gdy nie można znaleźć podciągu. s.find () zwraca -1, jeśli nie znaleziono podłańcucha.
Praxiteles
7

Znak może pojawić się wiele razy w ciągu. Na przykład w łańcuchu sentencepozycja ewynosi 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]
itssubas
źródło
1

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]
pylang
źródło
0

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')
Seb
źródło
4
Nie używaj tej metody. Nie ma powodu, aby wprowadzać numpy w prostą operację indeksowania ciągów.
Mike Holler