2014-11-19 2 views
0

У меня есть следующий список:Преобразовать плавать только в списке смешанного типа

ls1 = ['xxx', 3.88884, 2.383, 1.999, '-'] 

, что я хочу сделать, это преобразовать значение с плавающей точкой в ​​"%.2f", в результате чего это:

['xxx', '3.88', '2.38', '1.99', '-'] 

Но почему этот код не прошел?

def stringify_result_list(reslist): 
    finals = [] 
    print reslist 
    for res in reslist: 
     if type(res) == 'float': 
      tmp = "%.2f" % res 
      finals.append(tmp) 
     else: 
      finals.append(res) 
    print finals 
    return finals 

stringify_result_list(ls1) 
+2

'type' не возвращает строку. Например, тип «>>>» (тип (10)) ' – linuxfan

+0

И вы почти никогда не хотите проверять' type (res) 'anyway; используйте 'isinstance'. Если кто-то дал вам экземпляр подкласса 'float' (например, NumPy' float64', который выглядит почти как 'float' почти во всех отношениях), хотите ли вы, чтобы он был преобразован в строку или нет? – abarnert

ответ

3

type(res) не возвращает то, что вы думаете, он делает:

>>> type(1.0) 
<type 'float'> 
>>> type(type(1.0)) 
<type 'type'> 
>>> 

Как вы можете видеть, он возвращает объект типа для поплавков, а не строку "float". Вы можете прочитать об этом в поведении docs:

class type(object)
class type(name, bases, dict)

С одним аргументом, возвращает тип объекта. Возвращаемое значение представляет собой объект типа.isinstance() встроенная функция рекомендуется для проверки типа объекта.


Тем не менее, вы можете значительно упростить вашу функцию, используя list comprehension:

def stringify_result_list(reslist): 
    return ["%.2f" % x if isinstance(x, float) else x for x in reslist] 

Вы заметите также, что я использовал isinstance, чтобы проверить каждый элемент, является ли поплавок. Как сказано выше в цитате, это предпочтительный метод проверки типов в Python.

Смежные вопросы