Listeneinträge durchsuchen und Datentyp für alle Einträge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pascalsv
User
Beiträge: 16
Registriert: Samstag 7. Januar 2006, 15:45

Moinsen,

ich würde gerne eine Funktion schreiben, mit der eine beliebige eindimensionale Liste gefüttert wird und die als Rückgabewert angibt, ob sich alle Einträge der Liste in eint integer umwandeln lassen würden.

Bsp:
Liste1 = ['0001', '04711', '0451'] -> Diese Listeneinträge könnten alle in Integer umgewandelt werden.

Liste2 = ['0001', '04711', '1AAFFEE'] -> geht nicht.

Aber wie macht man dies am schnellsten und effizientesten?

Danke & Gruß,

Pascal
Life is short - don't buy green bananas...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Code: Alles auswählen

def check_list(list):
    for i in list:
        try:
            int(i)
        except:
            return False
    return True


Liste1 = ['0001', '04711', '0451']
Liste2 = ['0001', '04711', '1AAFFEE']

print check_list(Liste1)
print check_list(Liste2)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
pascalsv
User
Beiträge: 16
Registriert: Samstag 7. Januar 2006, 15:45

Jawoll ja! Schöner als meine Lösung.

Danke!!
Pascal
Life is short - don't buy green bananas...
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Diese Loesung liefert die Anzahl der Werte, die nicht in einen Integerwert gewandelt werden koennen (0 => True, alles andere False):

Code: Alles auswählen

def test(a):
    if a==int(a): return 0
    return 1

def check_list(liste):
    return sum(map(test,liste))

li=[1,2,3,4,5.5,6.6]
print check_list(li)
Gruss, Helmut
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

helmut hat geschrieben: Diese Loesung liefert die Anzahl der Werte, die nicht in einen Integerwert gewandelt werden koennen
Nö, diese Lösung liefert eine Fehlermeldung ;)
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

@ mawe,

hast recht; daran gibt's leider nichts zu deuteln.

Gruss, Helmut
Gast

Hallo!

Du koenntest auch mit hasattr(value,'__int__') schauen, ob das entsprechende Datum eine Routine besitzt, die eine Konvertierung in einen int zulassen.

Gruss Tom
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

jens hat geschrieben:

Code: Alles auswählen

def check_list(list):
    for i in list:
        try:
            int(i)
        except:
            return False
    return True
Ich persönlich fände folgende Lösung besser:

Code: Alles auswählen

def list_to_int(list):
  try:
    return map(int,list)
  except ValueError:
    return None
Dann könntest du mit list_to_int(list) == None prüfen, ob es nicht geht oder hättest auch gleich die konvertierte Liste; denn meistens will man etwas ja auch machen, wenn man weiss, dass es geht.

Die Pythonphilosophie ist es, anstatt versuchen zu erraten, ob es geht, es einfach direkt zu versuchen und auf entsprechende Fehler zu reagieren. (anstatt versuchen sie zu vermeiden)
BlackJack

"Pythonphilosophisch" ist die Rückgabe von `None` als spezieller Fehlerwert aber auch nicht so gerne gesehen. Dafür sind ja Ausnahmen da. Das heisst es würde auf ein einfaches ``map(int, whatever)`` hinauslaufen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Stimmt natürlich, aber er wollte ja unbedingt eine Funktion, die das testet.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wobei ich mein True/False garnicht so schlecht finde... Dann kann man einfach mit if nachschauen... Ob es Sinn macht wirklich die konvertierte Zahlenliste zurück zu liefern, weiß ich nicht, kommt auf den Anwendungsfall an...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten