733 Stimmen

Wie kann ich überprüfen, ob eine Zeichenfolge eine int darstellt, ohne try/except zu verwenden?

Kann man irgendwie feststellen, ob ein String steht für eine ganze Zahl (z.B., '3' , '-17' aber nicht '3.14' o 'asfasfas' ) Ohne Verwendung eines try/except-Mechanismus?

is_int('3.14') == False
is_int('-7')   == True

28 Stimmen

Warum versuchen beide, dies "auf die harte Tour" zu tun? Was ist falsch an try/except?

8 Stimmen

Ja, was ist falsch an try/except? Es ist besser, um Vergebung zu bitten als um Erlaubnis.

82 Stimmen

Ich würde fragen, warum sollte diese einfache Sache try/except erfordern? Das Ausnahmesystem ist ein komplexes Biest, aber dies ist ein einfaches Problem.

0voto

VasiliyBukharov Punkte 58

Wie ich verstanden habe, möchten Sie die Konvertierbarkeit von Strings in int. Um das zu tun, können Sie:

  1. Ersetze '-' durch nichts, denn '-' ist keine Ziffer und '-7' kann auch in int umgewandelt werden.
  2. Prüfen Sie, ob es sich um eine Ziffer handelt.

    def is_string_convertable_to_int(value: str) -> bool: return value.replace('-', '').isdigit()

P.S. Sie können diese Definition leicht modifizieren, um die Konvertierbarkeit von Strings in Floats zu prüfen. Fügen Sie einfach replace('.', '') hinzu und prüfen Sie das Vorhandensein eines '.' mit value.count('.') = 1.

-1voto

Carlos Vega Punkte 1301

Ich vermute, dass die Frage mit der Geschwindigkeit zusammenhängt, da der Versuch/Ausnahme eine Zeitstrafe hat:

 Testdaten

Zunächst habe ich eine Liste mit 200 Zeichenfolgen erstellt, 100 fehlende Zeichenfolgen und 100 numerische Zeichenfolgen.

from random import shuffle
numbers = [u'+1'] * 100
nonumbers = [u'1abc'] * 100
testlist = numbers + nonumbers
shuffle(testlist)
testlist = np.array(testlist)

 numpy-Lösung (funktioniert nur mit Arrays und Unicode)

np.core.defchararray.isnumeric kann auch mit Unicode-Strings arbeiten np.core.defchararray.isnumeric(u'+12') aber es gibt ein Array zurück. Es ist also eine gute Lösung, wenn Sie Tausende von Konvertierungen durchführen müssen und fehlende Daten oder nicht numerische Daten haben.

import numpy as np
%timeit np.core.defchararray.isnumeric(testlist)
10000 loops, best of 3: 27.9 µs per loop # 200 numbers per loop

try/except

def check_num(s):
  try:
    int(s)
    return True
  except:
    return False

def check_list(l):
  return [check_num(e) for e in l]

%timeit check_list(testlist)
1000 loops, best of 3: 217 µs per loop # 200 numbers per loop

Es scheint, dass die Numpy-Lösung viel schneller ist.

-4voto

HaulCozen Punkte 33

Äh Versuchen Sie das:

def int_check(a):
    if int(a) == a:
        return True
    else:
        return False

Dies funktioniert, wenn Sie keine Zeichenfolge eingeben, die keine Zahl ist.

Außerdem (ich habe vergessen, den Teil mit der Zahlenprüfung einzufügen) gibt es eine Funktion, die prüft, ob der String eine Zahl ist oder nicht. Es ist str.isdigit(). Hier ist ein Beispiel:

a = 2
a.isdigit()

Wenn Sie a.isdigit() aufrufen, wird True zurückgegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X