0
votes

Convertir une liste de chaîne en int ou float comme disponible

J'ai la liste comme:

list = [67.50, 70, 72.50, 75, 77.50, 80, 82.5]

Je veux vérifier si la chaîne est un foat alors elle doit être convertie en float et si la chaîne est un int alors elle doit être convertie en int.

Sortie souhaitée:

list = ['67.50', '70.00', '72.50', '75.00', '77.50', '80.00', '82.50']


2 commentaires

Il existe une belle liste (peut-être obsolète, mais instructive) sur ce qui peut et ne peut pas être analysé comme un flottant. Mais dans votre cas, il peut être suffisant de voir s'il y a un point décimal dans le nombre et sinon, analyser comme int else float: [float (n) if '.' dans n else int (n) pour n dans la liste]


celui-là aussi est proche: stackoverflow.com/questions/33130279/...


4 Réponses :


2
votes

Voici une façon d'utiliser une compréhension de liste et de vérifier si l'opérateur modulo d'une chaîne donnée convertie en float est 0.0 , soit pour le convertir en float soit en integer .

Notez également qu'il n'est pas possible d'utiliser directement la fonction intégrée int pour construire un entier à partir d'une chaîne avec des décimales, pour surmonter cela je suis en utilisant f-strings , où g imprimer un nombre donné sous forme de nombre à virgule fixe, avec dans ce cas 0 décimales:

[int('{0:g}'.format(float(i))) if float(i)%1 == 0. else float(i) for i in l]
# # [67.5, 70, 72.5, 75, 77.5, 80, 82.5]

Pour les versions python sous 3.6 utilisez .format pour le formatage de la chaîne:

l = ['67.50', '70.00', '72.50', '75.00', '77.50', '80.00', '82.50']

[int(f'{float(i):g}') if float(i)%1 == 0. else float(i) for i in l]
# [67.5, 70, 72.5, 75, 77.5, 80, 82.5]


5 commentaires

Qu'en est-il de 70 ?


Qu'en est-il @devesh?


Je veux dire que le code lèvera une exception si '70' est un élément de la liste


Eh bien, cela suppose qu'il y a des entiers, mais apparemment tous les nombres sont des décimales


La mise à jour de @DeveshKumarSingh devrait également fonctionner avec les entiers



5
votes

Vous pouvez utiliser float.is_integer():

>>> lst = ['67.50', '70.00', '72.50', '75.00', '77.50', '80.00', '82.50']
>>> [int(x) if x.is_integer() else x for x in map(float, lst)]
[67.5, 70, 72.5, 75, 77.5, 80, 82.5]


1 commentaires

Cette carte (float, lst) est intelligente. Je suis également d'accord avec l'utilisation de lst, au lieu de list comme nom de variable, car list est également une fonction intégrée de Python.



1
votes

Eh bien, cela fonctionne, mais il existe probablement une meilleure solution. Il gère le cas comme 75.00 que vous voulez convertir en entier et non en flottant.

python test.py
[67.5, 70, 72.5, 75, 77.5, 80, 82.5]

La sortie est

from math import floor
list = ['67.50', '70.00', '72.50', '75.00', '77.50', '80.00', '82.50']
print([int(floor(float(l))) if float(l)-floor(float(l)) == 0 else float(l) for l in list])


0 commentaires

1
votes

Voici une autre version:

<class 'float'>
<class 'int'>
<class 'float'>
<class 'int'>
<class 'float'>
<class 'int'>
<class 'float'>

Renvoie:

list = ['67.50', '70.00', '72.50', '75.00', '77.50', '80.00', '82.50']

new_list = []

for x in list:
    float_x = float(x)
    int_x = int(float_x)
    if int_x == float_x:
        new_list.append(int_x)
    else:
        new_list.append(float_x)

for y in new_list:
    print(type(y))


0 commentaires