Jak uzyskać pozycję postaci w Pythonie?


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.


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]


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'

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('.')]

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

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.


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]

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]

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')

4
Nie używaj tej metody. Nie ma powodu, aby wprowadzać numpy w prostą operację indeksowania ciągów.
— Mike Holler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.