2016-03-19 8 views
1

würde ich eine Funktion wie die, wenn ein bestimmte Eingang eines fällt inWie ermittelt man, ob ein String-Objekt eine Integer-, Double-, Boolean-, Date- oder String-Variable ist, die python verwendet?

der folgenden Kategorien bestimmen kann
  • integer
  • Doppel
  • boolean
  • Datum
  • Zeichenfolge

Dies ist die Funktion, die ich derzeit habe, aber die Herausforderung besteht darin, dass, wenn die Eingabe als Zeichenfolge kommt, ich die Funktion möchte tion zu bestimmen, nach wie vor, wenn es ein Datum, integer, double, boolean ist, oder String

def text_type_determine(i): 
    if type(i) == int: 
     return 'integer' 
    elif type(i) == float: 
     return 'double' 
    elif type(i) == bool: 
     return 'boolean' 
    elif type(i) == str: 
     return 'string' 

Zum Beispiel würde ich die folgenden Eingaben wie die dazugehörigen Ergebnisse liefern:

  • ‚2015-01 -01' -> 'Datum'
  • '1' -> 'integer'
  • '1,0' -> 'doppelte'
  • 'true' -> 'boolean'
  • 'random string' -> Zeichenfolge
+2

Haben Sie den Anfang einer Idee, wie Sie das selbst machen? Diese Seite neigt dazu, die einfachen "Gib mir ein paar Code" -Fragen zu missbilligen, selbst wenn sie höflich gefragt werden. –

Antwort

0

Sie eval wie diese verwenden:

def text_type_determine(i): 
    i = eval(i) 
    if type(i) == int: 
     return 'integer' 
    elif type(i) == float: 
     return 'double' 
    elif type(i) == bool: 
     return 'boolean' 
    elif type(i) == str: 
     return 'string' 

So folgt aus:

print(text_type_determine("12.3")) 

ausgeben würde:

double 
+0

Als String ist eine * zweite * Alternative, nicht die einzige. 'i' könnte' 4,5' sein, in diesem Fall würden Sie einen Fehler in dieser 'eval (i)' Zeile bekommen. – zondo

+0

Editieren Sie einfach so, wenn es sich um eine Zeichenkette handelt, sonst wird der Typ überprüft() –

0

Sie die Konvertierung mit einem try/catch testen Anweisung als (nur für int):

def isInt(s): 
    try: 
     int(s) 
     return True 
    except ValueError: 
     return False 

def text_type_determine(s): 
    if isInt(s): 
     return 'integer' 
0

Sie könnten versuchen, jedes Element auf die verschiedenen Arten in logischer Abfolge zu werfen und jeden Fall behandeln:

from datetime import datetime 

def text_type_determine(i): 
    # datetime is the most specific, so start with it 
    try: 
     datetime.strftime(i, '%Y-%m-%d') 
     return 'date' 
    except: 
     # Next try int before float since float(`4`) will work 
     try: 
      int(i) 
      return 'integer' 
     except: 
      try: 
       # Python uses float not double, but I think it should do 
       float(i) 
       return 'double' 
      except: 
       pass 
    # Finally if all our number cases fail, check if 
    # we have a boolean, otherwise it's just a string 
    if i in ['true', 'false']: 
     return 'boolean' 
    return 'string' 

Dies setzt natürlich voraus, dass Daten nur im Format YYYY-MM-DD sind und dass Alle booleschen Werte sind entweder true oder false. Es sollte ziemlich einfach sein, weitere Optionen hinzuzufügen.

0

Ich habe keine Ahnung, was Sie mit Datum meinen, da es nicht in Ihrem eigenen Code erscheint, aber wenn Sie potenzielle Ints, Floats, die Strings usw. sind, bewerten möchten.

In [17]: text_type_determine(1) 
Out[17]: 'integer' 

In [18]: text_type_determine(datetime.now()) 
Out[18]: 'date' 

In [19]: text_type_determine("2016-03-19") 
Out[19]: 'date' 

In [20]: text_type_determine("2016") 
Out[20]: 'integer' 

In [21]: text_type_determine("2016.23") 
Out[21]: 'double' 
:

from dateutil import parser 
from datetime import datetime 

def text_type_determine(i): 
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string', datetime: "date"} 
    for tpe in [literal_eval, parser.parse]: 
     try: 
      return types.get(type(tpe(i))) 
     except (AttributeError, ValueError): 
      pass 
    return types.get(type(i)) 

die Ihnen: Sie können ast.literal_eval

from ast import literal_eval 

def text_type_determine(i): 
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string'} 
    try: 
     return types.get(type(literal_eval(i))) 
    except ValueError: 
     return types.get(type(i)) 

Wenn Sie, wenn das Objekt testen wollte als ein Datum analysiert werden könnten Sie dateutil in so etwas wie verwenden könnte verwenden

Sie könnten die Prüfreihenfolge neu anordnen, da dateutil.parser Ihnen unerwartete Ergebnisse liefern könnte. Wenn Ihre Daten immer in der gleichen Reihenfolge sind, dann verwenden Sie einfach , um die Analyse zu tun, wenn nicht bar versucht jede mögliche Datumsvariation mit strptime dann dateutil wird eine viel bessere Lösung sein.

Verwandte Themen