Gå til innhold

Alle argument til tall (int/float)?


Anbefalte innlegg

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 av dabear
Lenke til kommentar
Videoannonse
Annonse

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 :p

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...