2015-10-16 5 views
5

Ich habe eine Liste von Elementen mit heterogenen Datentypen in Strings enthalten.

lst=['1','err','-1',' ','155'] 

Von diesen, würde Ich mag eine neue Liste erhalten, nur mit den positiven Zahlen: new_lst=[1,155]nur positive Zahl aus einer Liste, die heterogene Datentyp Element in Python enthält 3

habe ich versucht, negative Zahlen zu vermeiden, wie unten gezeigt. Allerdings bin ich die Saiten und leere Zeichenfolgen zu vermeiden, nicht in der Lage:

lst1=int(lst) 
for i in lst1: 
    if i<0: 
    print i 
    else: 
    continue 

Traceback (most recent call last): 
    File "C:/Users/Dev/Documents/Assignment-2/test-2.py", line 22, in <module> 
    c3=int(row[3]) 
ValueError: invalid literal for int() with base 10: 'err' 
>>> 
+0

Mögliches Duplikat von [Prüft, ob eine Variable eine Ganzzahl ist oder nicht] (http://stackoverflow.com/questions/3501382/checking-whether-a-variable-is-annteger-or-not) – Ryan

+1

Dies ist hört sich nach Hausaufgaben an, anstatt dir einen funktionierenden Code zu geben, gebe ich dir eine Idee, wie du sie lösen kannst. Iterieren Sie zunächst Ihre Liste und versuchen Sie für jedes Element in der Liste, es in ein "int" umzuwandeln. Wenn die Konvertierung erfolgreich ist, überprüfen Sie, ob die Zahl größer als 0 ist. Wenn dies der Fall ist, können Sie sie zu Ihrer Positivliste hinzufügen. –

+0

Wickeln Sie Ihren "int()" Anruf in einem Versuch/ausgenommen. – RobertB

Antwort

2

lst1=int(lst) der Code, der die Ausnahme erzieht. Dies ist im Wesentlichen versucht, eine list in eine int zu werfen (was Sie nicht tun können).

Was Sie tun möchten, ist durch lst laufen, und für jedes Element, festzustellen, ob das Element in ein int gegossen werden kann, dann prüfen, ob das Element (als int) positiv ist.


Man könnte so etwas tun:

lst = ['1','err','-1',' ','155'] 
new_lst = [] 

for i in lst: 
    try: 
     int_i = int(i)   # try to cast i to an int 
     if int_i > 0: 
      new_lst.append(int_i) 
    except ValueError:   # ValueError is raised, i cannot be cast into an int 
     pass      # continue to the next element 

EDIT: ValueError auf Vollständigkeit hinzugefügt, siehe @ bigz Antwort.

3
lst=['1','err','-1',' ','155'] 
newlst = [] 
for i in lst: 
    try: 
     if int(i) >= 0: 
      newlst.append(int(i)) 
    except ValueError: 
     pass 
2

Hier ist ein Liner, der testet, ob ein Element tatsächlich eine Zahl ist. Wenn diese Überprüfung nicht durchgeführt wird, funktioniert int(x) nicht und wirft und Ausnahme.

lst=['1','err','-1',' ','155'] 
lst1 = filter(None,[(lambda x: x if x.isdigit() and int(x) > 0 else None) (x) for x in lst]) 
1

Wenn Sie nur Ints haben und überlegen sich nur positive Zahlen halten wollen str.isdigit ausreichend ist, wie Sie kümmern sich nicht, wenn "-1" auf str.isdigit versagt:

lst[:] = (ele for ele in lst if ele.isdigit() and int(ele) > 0) 

Wenn Sie möglicherweise haben Schwimmer haben dann Alle Antworten mit int und einem Versuch/Ausnahme würden auch fehlschlagen, wenn Sie "1.0" usw. abdecken möchten.

Verwandte Themen