it-swarm.com.de

Wie konvertiere ich String-Werte aus einem Wörterbuch in Datentypen int/float

Ich habe eine Liste von Wörterbüchern wie folgt:

list = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]

Wie konvertiere ich die Werte jedes Wörterbuchs in der Liste in int/float?

So wird es:

list = [ { 'a':1 , 'b':2 , 'c':3 }, { 'd':4 , 'e':5 , 'f':6 } ]

Vielen Dank.

20
siva
for sub in the_list:
    for key in sub:
        sub[key] = int(sub[key])

Verleiht ihm ein Casting als Int statt als String.

21
Jim

Liebe Listenauffassungen.

[dict([a, int(x)] for a, x in b.items()) for b in list]

( Anmerkung: Für nur Python 2-Code können Sie "iteritems" anstelle von "items" verwenden).

37
Powertieke

Wenn dies genau Ihr Format ist, können Sie die Liste durchgehen und die Wörterbücher ändern.

for item in list_of_dicts:
    for key, value in item.iteritems():
        try:
            item[key] = int(value)
        except ValueError:
            item[key] = float(value)

Wenn Sie etwas allgemeineres haben, müssen Sie das Wörterbuch rekursiv aktualisieren. Überprüfen Sie, ob es sich bei dem Element um ein Wörterbuch handelt, und verwenden Sie das rekursive Update. Wenn es in ein Float oder ein int umgewandelt werden kann, konvertieren Sie es und ändern Sie den Wert im Wörterbuch. Dafür gibt es keine eingebaute Funktion und sie kann ziemlich hässlich sein (und nicht Pythonic, da normalerweise Aufruf aufgerufen werden muss).

4

Um die Möglichkeit von int, float und leeren Zeichenfolgenwerten zu handhaben, würde ich eine Kombination aus Listenverständnis, Wörterbuchverständnis und bedingten Ausdrücken verwenden, wie gezeigt:

dicts = [{'a': '1' , 'b': '' , 'c': '3.14159'},
         {'d': '4' , 'e': '5' , 'f': '6'}]

print [{k: int(v) if v and '.' not in v else float(v) if v else None
            for k, v in d.iteritems()}
               for d in dicts]

# [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]

Python 2 wurde jedoch erst in Version 2.7 mit Wörterbucherfassungen versehen. Sie kann in früheren Versionen immer noch als einzelner Ausdruck ausgeführt werden, muss jedoch mit dem dict-Konstruktor wie folgt geschrieben werden:

# for pre-Python 2.7

print [dict([k, int(v) if v and '.' not in v else float(v) if v else None]
            for k, v in d.iteritems())
                for d in dicts]

# [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]

Beachten Sie, dass auf diese Weise ein neues Wörterbuch mit Listen erstellt wird, anstatt das ursprüngliche an Ort und Stelle zu ändern (dies müsste anders erfolgen).

1
martineau

Wenn Sie sich für eine Lösung entscheiden, die "an Ort und Stelle" agiert, können Sie sich diese anschauen:

>>> d = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]
>>> [dt.update({k: int(v)}) for dt in d for k, v in dt.iteritems()]
[None, None, None, None, None, None]
>>> d
[{'a': 1, 'c': 3, 'b': 2}, {'e': 5, 'd': 4, 'f': 6}]

Übrigens, die Schlüsselreihenfolge wird nicht beibehalten, da Standardwörterbücher auf diese Weise funktionieren, dh ohne das Konzept der Reihenfolge.

0
Paolo
  newlist=[]                       #make an empty list
  for i in list:                   # loop to hv a dict in list  
     s={}                          # make an empty dict to store new dict data 
     for k in i.keys():            # to get keys in the dict of the list 
         s[k]=int(i[k])        # change the values from string to int by int func
     newlist.append(s)             # to add the new dict with integer to the list
0
raton