web-dev-qa-db-fra.com

Comment convertir les valeurs de chaîne d'un dictionnaire en types de données int/float?

J'ai une liste de dictionnaires comme suit:

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

Comment convertir les valeurs de chaque dictionnaire de la liste en int/float?

Alors ça devient:

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

Merci.

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

Lui donne un casting comme un int au lieu d'une chaîne.

21
Jim

Je dois comprendre la liste d'amour.

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

( remarque: pour le code uniquement Python 2, vous pouvez utiliser "iteritems" au lieu de "items" )

37
Powertieke

Si c'est votre format exact, vous pouvez parcourir la liste et modifier les dictionnaires.

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

Si vous avez quelque chose de plus général, vous devrez faire une sorte de mise à jour récursive du dictionnaire. Vérifiez si l'élément est un dictionnaire, si c'est le cas, utilisez la mise à jour récursive. S'il peut être converti en float ou en int, convertissez-le et modifiez la valeur dans le dictionnaire. Il n'y a pas de fonction intégrée pour cela et cela peut être assez moche (et non-Pythonic car cela nécessite généralement d'appeler isinstance).

4
Jonathan Sternberg

Pour gérer la possibilité de valeurs int, float et de chaînes vides, j'utilisais une combinaison de compréhension de liste, de compréhension du dictionnaire et d'expressions conditionnelles, comme indiqué:

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}]

Cependant, la compréhension du dictionnaire n'a pas été ajoutée à Python 2 jusqu'à la version 2.7. Cela peut toujours être fait dans les versions précédentes en tant qu'expression unique, mais doit être écrit en utilisant le constructeur dict comme suit:

# 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}]

Notez que de toute façon, cela crée un nouveau dictionnaire de listes, au lieu de modifier le dictionnaire original sur place (ce qui devrait être fait différemment).

1
martineau

Si vous optez pour une solution agissant "sur place", vous pouvez consulter celle-ci:

>>> 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}]

Au fait, l'ordre des clés n'est pas préservé, car c'est ainsi que fonctionnent les dictionnaires standard, c'est-à-dire sans le concept d'ordre.

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