2016-07-21 21 views
0

Ich habe ein Python-Skript, das liest eine CSV-Datei und speichert jeden der Werte in einer Liste von Listen: list [x] [y]. Ich habe damit keine Probleme.Überprüfen, ob Element in einer Python-Liste eine Int/Nummer ist

Ich möchte eines dieser Felder überprüfen, um zu sehen, ob es eine Zahl (ganze Zahl) ist.

Wenn ich ausführen ein print type(list[i][0]) es gibt <type 'str'> obwohl der Wert sagen 100.

Die if-Anweisungen unten in einer for Schleife sind so die Listen iteriert durch das, was ich dachte zu tun, einen Scheck tut:

if type(list[i][0] == types.IntType): 
    True 
else: 
    False 

Dies funktioniert jedoch, dass bei der in PEP8 verpönt ist und so sollte ich isinstance() verwenden, daher habe ich es zu

modifizierte
# check if a value is entered 
if list[i][0] != '': 
    if isinstance(int(list[i][0]), int): 
     True 
    else: 
     False 
else 
    False 

Aber ich stoße auf das Problem zu versuchen, eine Zeichenfolge in ein int zu konvertieren (wenn der Benutzer eine Zeichenfolge eingibt).

Wie überwinde ich das? Es scheint ein einfaches Problem zu sein, aber ich bin neu in Python, also habe ich mich über eine saubere und effiziente Art und Weise gefragt, damit umzugehen. Sollte ich prüfen, ob der Wert ein int ist, bevor ich ihn in der Liste ablege?

Ich benutze Python2.

Dank

edit: Ich habe die isinstance() Scheck um einen Versuch Ausnahme fangen aber ich dieses Gefühl, ich sollte nicht nur eingewickelt haben Zuflucht zu überprüfen, ob etwas ein int ist oder nicht? Ich bin nur neugierig, ob es einen besseren Weg dafür gibt.

bearbeiten: Ich habe isdigit wie bereits erwähnt verwendet, aber ich bekam negative Ergebnisse.

d. H. Diesen Datensatz angegeben. Liste [0] [0] = 123, Liste [1] [0] = asdasd

for i in range(0, 1): 
    if (list[i][0]).isdigit: 
     tempInt = list[i][0] 
     print type(tempInt) 
     print 'True: ' + tempInt 
    else: 
     tempInt = 1 
     print 'False: ' + tempInt 

Ergebnisse:

<type 'str'> 
True: 123 
<type 'str'> 
True: asdasd 
+0

Ich denke, das Duplikat ist falsch. Ziemlich sicher, dass er "123" in "123" umwandeln möchte, was durch 'somestring.isdigit' gemacht wird, um zu überprüfen oder' int (somestring) 'zu konvertieren. –

+0

@ReutSharabani Ja, Sie haben Recht, diese doppelte Frage bezieht sich nicht auf mein Problem – Brendan

+0

Ich empfehle, die Antworten dieser Frage durchzulesen. Du findest [eine, die ausdrücklich 'isdigit()'] erwähnt (http://stackoverflow.com/a/23464130/2617068). – TigerhawkT3

Antwort

1

Sie können es mit diesem überprüfen - das gilt für alle Zahlen (positiv und negative ganze Zahl, schwimmt, Nan), für nur int oder bestimmte Unterklasse, könnten bessere Ansätze existieren.

def is_number(a): 
    # will be True also for 'NaN' 
    try: 
     number = float(a) 
     return True 
    except ValueError: 
     return False 

Bei Nennwert, sieht es nicht gut aus. Aber ich denke, das ist wahrscheinlich der beste Weg, wenn Sie alle Zahlen (Negativ, Float, Integer, Unendlichkeit usw.) betrachten möchten. Sie können eine hoch angesehene/gewählte Frage/Antwort sehen here. Beachten Sie auch, dass isdigit nicht in allen Fällen funktioniert.

+0

Danke, ich habe vergessen, das zu meinem Post hinzuzufügen. Ja, ich habe darüber nachgedacht, was funktioniert, aber obwohl ich es für ein bisschen grob halte, eine Ausnahme zu fangen, nur um zu überprüfen, ob ein Wert ein int ist oder nicht. – Brendan

+0

Diese Antwort ist falsch. Es wird fälschlicherweise Werte wie "1.2" akzeptieren, die keine Ganzzahlen sind, wie das OP es wünscht. Warum benutzt du 'float()'? – TigerhawkT3

+0

Ich sah 'int/number' im Titel. Ich denke, OP will alle Zahlen im mathematischen Sinne betrachten. – DurgaDatta

0

Die folgende Vorgehensweise für ganze Zahlen zurückkehren nur:

string_list = ['20.0', '100', 'abc', '10.3445', 'adsfasdf.adsfasdf', '10,3445', '34,0'] 

def check(inp): 
    try: 
     inp = inp.replace(',', '.') 
     num_float = float(inp) 
     num_int = int(num_float) 
     return num_int == num_float 
    except ValueError: 
     return False 

print([check(s) for s in string_list]) 

Giving:

[True, True, False, False, False, False, True] 

Der Trick ist, um die Zeichenfolge zu einem Schwimmer zuerst zu werfen und konvertieren, dass in eine ganze Zahl (was rund der Float, wenn der Dezimalteil nicht Null ist). Danach können Sie die Integer- und Float-Darstellung der Eingabe vergleichen, um herauszufinden, ob die Eingabe eine Ganzzahl war oder nicht. Ich fügte .replace() hinzu, um sowohl europäische als auch amerikanische/englische Dezimalnotation mit Kommas zu unterstützen.