index - python string substring
Wie erstelle ich einen ValueError? (4)
Ich habe diesen Code, der den größten Index eines bestimmten Zeichens in einer Zeichenfolge findet, aber ich möchte, dass es einen ValueError
wenn das angegebene Zeichen in einer Zeichenfolge nicht auftritt.
So etwas wie das:
contains('bababa', 'k')
würde zu einem führen:
→ ValueError: could not find k in bababa
Wie kann ich das machen?
Hier ist der aktuelle Code für meine Funktion:
def contains(string,char):
list = []
for i in range(0,len(string)):
if string[i] == char:
list = list + [i]
return list[-1]
Hier ist eine überarbeitete Version Ihres Codes, die immer noch funktioniert und es zeigt, wie Sie einen ValueError
wie ValueError
anheben können. By-the-way, ich denke find_last()
, find_last_index()
, oder etwas ähnlich wäre ein aussagekräftiger Name für diese Funktion.
def contains(char_string, char):
largest_index = -1
for i, ch in enumerate(char_string):
if ch == char:
largest_index = i
if largest_index > -1: # any found?
return largest_index # return index of last one
else:
raise ValueError('could not find {} in {}'.format(char, char_string))
print(contains('mississippi', 's')) # -> 6
print(contains('bababa', 'k')) # ->
Traceback (most recent call last):
File "how-to-raise-a-valueerror.py", line 15, in <module>
print(contains('bababa', 'k'))
File "how-to-raise-a-valueerror.py", line 12, in contains
raise ValueError('could not find {} in {}'.format(char, char_string))
ValueError: could not find k in bababa
Update - Ein wesentlich einfacherer Weg
Beeindruckend! Hier ist eine viel prägnantere Version - im Wesentlichen ein Einzeiler -, die wahrscheinlich auch schneller ist, weil sie (über [::-1]
) die Zeichenkette umkehrt, bevor sie vorwärts für das erste übereinstimmende Zeichen durchsucht wird, und zwar unter Verwendung der schnelle integrierte String- index()
-Methode. In Bezug auf Ihre eigentliche Frage ist ein netter kleiner ValueError
, der mit der Verwendung von index()
ValueError
dass es bereits einen ValueError
wenn der Zeichenteilstring nicht gefunden wird, also ist nichts zusätzliches erforderlich, um dies zu ermöglichen.
Hier ist es zusammen mit einem schnellen Unit-Test:
def contains(char_string, char):
# (-1 adjusts returned index to account for searching in reverse)
return len(char_string) - char_string[::-1].index(char) - 1
print(contains('mississippi', 's')) # -> 6
print(contains('bababa', 'k')) # ->
Traceback (most recent call last):
File "better-way-to-raise-a-valueerror.py", line 9, in <module>
print(contains('bababa', 'k'))
File "better-way-to-raise-a-valueerror", line 6, in contains
return len(char_string) - char_string[::-1].index(char) - 1
ValueError: substring not found
In der neuesten Version von Python können Sie dafür fstrings verwenden
Lässt value = "Hello"
raise ValidationError(f"{value} is not valid category")
>>> def contains(string, char):
... for i in xrange(len(string) - 1, -1, -1):
... if string[i] == char:
... return i
... raise ValueError("could not find %r in %r" % (char, string))
...
>>> contains('bababa', 'k')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in contains
ValueError: could not find 'k' in 'bababa'
>>> contains('bababa', 'a')
5
>>> contains('bababa', 'b')
4
>>> contains('xbababa', 'x')
0
>>>
>>> response='bababa'
... if "K" in response.text:
... raise ValueError("Not found")