Я пытаюсь изучить Python, и у меня есть проблема, поэтому, если у меня есть что-то подобное:

data_l = ['data', '18.8', '17.9', '0.0']

Как мне сделать это так?

data_l = ['data', 18.8, 18.9, 0.0]
0
Fabien 30 Авг 2017 в 12:28

4 ответа

Лучший ответ

Вы можете создать простую служебную функцию, которая либо преобразует данное значение в число с плавающей запятой, если это возможно, либо возвращает его как есть:

def maybe_float(s):
    try:
        return float(s)
    except (ValueError, TypeError):
        return s

orig_list = ['data', '18', '17', '0']
the_list = [maybe_float(v) for v in orig_list]

И, пожалуйста, не используйте имена встроенных функций и типов, таких как list и т. Д. В качестве имен переменных.


Поскольку ваши данные на самом деле имеют структуру, а не являются действительно смешанным списком строк и чисел, кажется, что четыре кортежа из (str, float, float, float) более подходящие:

data_conv = (data_l[0], *(float(v) for v in data_l[1:]))

Или в старых версиях Python

# You could also just convert each float separately since there are so few
data_conv = tuple([data_l[0]] + [float(v) for v in data_l[1:]]) 
5
Ilja Everilä 30 Авг 2017 в 10:04

Вышеупомянутые подходы работают, но так как смешанный список может также содержать целочисленное значение, я добавил дополнительную проверку.

def validate(num):
    try:
        return int(num)
    except (ValueError, TypeError):
        try:
            return float(num)
        except (ValueError, TypeError):
            return num


vals_ = ['cat' ,'s-3-f','7390.19','12']
new_list = [validate(v) for v in vals_]  

Выход:

['cat', 's-3-f', 7390.1, 12]
0
adam shamsudeen 25 Май 2018 в 06:48

Универсальный подход:

def validate_number(s):
    try:
        return float(s)
    except (ValueError, TypeError):
        return s

data = [validate_number(s) for s in data]

В случае, если структура является фиксированной:

data = [s if i == 0 else float(s) for i, s in enumerate(data)]

Другой:

data = [data[0]] + [float(s) for s in data[1:]]

isdigit будет работать в случае натуральных чисел:

data = [int(s) if s.isdigit() else s for s in data]
1
Danil Speransky 30 Авг 2017 в 09:46

Вы можете использовать метод str.isdigit и понимание списка:

list = [int(s) if s.isdigit() else s for s in list]

Здесь у вас есть живой пример

2
Netwave 30 Авг 2017 в 09:32