Попытка преобразовать в числа с попыткой, кроме - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь преобразовать элементы в списке нескольких типов в плавающие значения, чтобы

L = ["29.3", "tea", "1", None, 3.14]

стало

D = [29.3, "tea", 1, None, 3.14]

Моя попытка выглядит следующим образом:

L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
    try:
        float(item)
        D.append(item)
    except ValueError:
        D.append(item)

print(D)

Это выдает

line 5, in <module>
    float(item)
TypeError: float() argument must be a string or a number, not 'NoneType'` error. 

Если я изменю элемент None на строку, как в "None", он генерирует список Dидентично L.Итак ...

  1. Как пропустить элемент None?Нужно ли использовать оператор if item == None: pass или есть лучший способ?
  2. Почему преобразование типов не работает, даже если я изменяю None на "None"?

Ответы [ 5 ]

0 голосов
/ 29 мая 2018

Попробуйте cincudate ошибки, используя их в последнем случае.Так что, если ошибка в NoneType, вы можете попробовать обойти с помощью if var is type: или if is isinstance(var, type):. В других типах, таких как bool (True / False), вы должны использовать eval (var), чтобы преобразовать их в bool.

L = ["29.3", "tea", "1", None, 3.14]
D = []

for item in L:
    if item is None:
        D.append(item)
        pass
    else:
        try:
            D.append(float(item))
        except ValueError or TypeError:
            D.append(item)
0 голосов
/ 29 мая 2018

Когда конструктору float дается что-то другое, кроме строки или числа, он вызывает TypeError вместо ValueError.Вам нужно поймать оба.

Вот способ использования списочного понимания.

def try_float(x):
    try:
        return float(x)
    except (ValueError, TypeError):
        return x

l = ["29.3", "tea", "1", None, 3.14]
d = [try_float(x) for x in l]

print(d)  # [29.3, 'tea', 1.0, None, 3.14]
0 голосов
/ 29 мая 2018

try-except для ловли исключений.В этом сценарии учитывается только одно исключение ValueError, но не TypeError.Чтобы поймать ошибку типа, просто поместите еще один except блок ниже try.В вашем случае это будет выглядеть так:

L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
    try:
        float(item)
        D.append(float(item))
    except TypeError:
        # do something with None here
    except ValueError:
        D.append(item)

print(D)

Учитывая, что вы хотите перехватывать несколько исключений в одном блоке except, используйте кортеж исключений:

L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
    try:
        float(item)
        D.append(float(item))
    except (ValueError, TypeError):
        D.append(item)
print(D)
0 голосов
/ 29 мая 2018
  1. Да , вы можете просто использовать if item == None: pass для проверки типа перед преобразованием.
  2. Вы можете использовать if isinstance(item, str): ... для явного преобразования строки в число с плавающей точкой.
0 голосов
/ 29 мая 2018

Вы можете напрямую добавить в блок try:

Код:

try:
    D.append(float(item))
except (ValueError, TypeError):
    D.append(item)

Код теста:

L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
    try:
        D.append(float(item))
    except (ValueError, TypeError):
        D.append(item)

print(D)

Результаты:

[29.3, 'tea', 1.0, None, 3.14]
...