dabear Skrevet 17. januar 2007 Del Skrevet 17. januar 2007 (endret) Heisann. Finnes det en enkel måte å sørge for at all element i lista some_args er float eller ints? Strings, dicts, lists og andre objekt bør bli null. I tillegg burde det gå å tvinge alle argument - floats eller ikke - til å castes til ints. Problemet med ei løkke alla args = [int(arg) for arg in some_args] er jo at int() ikke kan ta imot alle mulige objekter (strings av typen '2.2' feiler fks) Jeg har ei fungerende løsning basert på en generator, men tenkte kanskje det fantes en innebygd funksjon en eller annen plass? Klikk for å se/fjerne innholdet nedenfor #!/bin/env python import sys def provideNumbers(l=None, intify=True): assert isinstance(l, list), 'Arg not a list!' for potensial_num in l: num=0 try: num = float(potensial_num) except: yield 0 else: if intify: try: num = int(num) except ValueError: pass yield num not_a_list = "It's infact a string!" print sum(provideNumbers(sys.argv[1:])) Endret 17. januar 2007 av dabear Lenke til kommentar
FraXinuS Skrevet 17. januar 2007 Del Skrevet 17. januar 2007 Vet ikke om det er noen innebyggde som gjør dette, men jeg lagde en: Ser helt mongis ut, så det er nok bedre å lage en vanlig funksjon some_args = [1,2,3, "aeraga", "343.34", "2342", [1,2], "few"] en måte: args = [(lambda x, i=True: ((isinstance(x, int) or isinstance(x, float)) and ((i and int(x)) or x)) or (isinstance(x, basestring) and ((x.strip().isdigit() and int(x)) or (''.join(x.strip().split('.')).isdigit() and ((i and int(float(x))) or float(x))))) or 0)(a) for a in some_args] en annen: args = map((lambda x, i=True: ((isinstance(x, int) or isinstance(x, float)) and ((i and int(x)) or x)) or (isinstance(x, basestring) and ((x.strip().isdigit() and int(x)) or (''.join(x.strip().split('.')).isdigit() and ((i and int(float(x))) or float(x))))) or 0), some_args) enda en: l2 = lambda li, intify=True: (isinstance(li, list) or isinstance(li, tuple)) and (map(lambda x, i=intify: ((isinstance(x, int) or isinstance(x, float)) and ((i and int(x)) or x)) or (isinstance(x, basestring) and ((x.strip().isdigit() and int(x)) or (''.join(x.strip().split('.')).isdigit() and ((i and int(float(x))) or float(x))))) or 0, li)) or 0 args = l2(some_args) args blir [1, 2, 3, 0, 343, 2342, 0, 0] Det går også an å ta l2(some_args, False) for å beholde float Lenke til kommentar
zeitgeist Skrevet 18. januar 2007 Del Skrevet 18. januar 2007 Vet ikke om noe built-in som gjør akkurat det, men noe slikt kanskje: def cast(x): """ return float(x) or int(x) if x is number or string, else 0 """ try: return float(x) except (ValueError, TypeError): try: return int(x) except (ValueError, TypeError): return 0 else: return 0 L = [1, 1.0, '2', '2.1', 0x16, [1,2,3], {'k':1}, 'abc'] print [cast(x) for x in L] tar ikke hex-verdier som er i strenger, eg. "0x16". Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå