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






string