2013-07-02 2 views
0

Как использовать тип python в List Comprehension? Могу ли я?Как использовать тип python в понимании списка

>>> ll 
[1, 2, 5, 'foo', 'baz', 'wert'] 

>>> [x for x in ll ] 
[1, 2, 5, 'foo', 'baz', 'wert'] 

>>> [x for x in ll if type(x) == 'int'] 
[] 

>>> [x*20.0 for x in ll if type(x) == 'int'] 
[] 
>>> type(ll[0]) 
<type 'int'> 

Ищу: [20, 40, 100, 'foo', 'baz', 'wert']

+1

'' int'' - это просто строка. Вы хотите 'int' (без кавычек). 'isinstance' обычно более устойчив, чем использование' type' –

+0

type (1) является типом типа, а не 'string' type, type (type (1)) == type – liuzhijun

ответ

1

Как правило, в Python , лучше всего использовать «Duck Typing». Один из способов сделать это является использование обработки исключений, которые в этом случае должны были бы вспомогательную функцию:

def safe_multiply(x, y): 
    try: 
     return x * y 
    except TypeError: 
     return x 

[safe_multiply(x, 20) for x in ll] 

Альтернативой утка-типирование ответ должен увидеть, если объект имеет метод для умножения:

[x * 20 if hasattr(x, "__mul__") else x for x in ll] 

Но оба выше имеют странность: в Python это законно использовать * со строкой, и результат повторяет строку:

print("foo" * 3) # prints "foofoofoo" 

Так что лучший способ пойти на т o используйте ответ Игнасио Васкес-Абрамса. Он на самом деле не дают вам код, так вот она:

[x * 20 if isinstance(x, int) else x for x in ll] 
2

Вы вообще нет. Вместо этого используйте isinstance().

+0

как бы использовать, я думал, else, чтобы получить правильный вывод – Merlin

+0

Зачем вам использовать 'else'? У вашего оригинала нет. –

+0

[x * 20.0 for x in ll if type (x) == int] .... [20.0, 40.0, 100.0] – Merlin

1

Вы должны использовать "это ИНТ" вместо "== 'Int'"

[20 * х, если тип (х) ИНТ еще х для х в ЛЛ]

+0

не дает правильного результата ... str отсутствует – Merlin

+0

aha, я вижу вашу цель сейчас , Соответственно изменил мой ответ. –

0

Не используйте ==, используйте «это» вам нужно написать код так:

[x for x in ll if type(x) is 'int'] 
1
>>> ll = [1, 2, 5, 'foo', 'baz', 'wert'] 
>>> [ x*20.0 if isinstance(x, int) else x for x in ll] 
[20.0, 40.0, 100.0, 'foo', 'baz', 'wert'] 
+0

Если вы посмотрите на нижнюю часть вопроса, появится пример желаемого вывода. Строки должны быть переданы без изменений, а не отфильтрованы. – steveha

+0

ты прав. Ред. – Friedmannn

2

Попробуйте это:

In [6]: [x * 20.0 if type(x) is int else x for x in ll] 
Out[6]: [20.0, 40.0, 100.0, 'foo', 'baz', 'wert'] 

Здесь вы проверяете тип с type(x) is int, и если это так, - многократно, иначе вы просто добавьте й к повторному (else x), точно так же, как вы хотели.

+0

Разработайте свой ответ. – Omar

+0

Теперь лучше? Извините, я новичок здесь. –

+0

Yup, хорошо выглядит :) – Omar

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