2015-11-19 3 views
1

Предположим, что я хотел бы преобразовать список строк в целое число, но это не может быть сделано для всех элементов.Python: «Попробуйте» внутри сокращено для ... loop

Я знаю, что это работает:

a = ['2.0','3.0','4.0','5.0','Cherry'] 
b = [] 

for k in a: 
    try: 
     int(k) 
     b.append(int(k)) 
    except: 
     pass 

print b 
> [2, 3, 4, 5] 

Но есть и более короткий способ сделать это? Я думал о чем-то вроде:

b = [try int(k) for k in a] 

Это может звучать как глупый вопрос, так как у меня есть рабочее решение, но я часто был показан более короткими способами сделать то же самое и всегда ценил этот вид помощи. Я использую Python 2.7

Спасибо!

Редактировать: извините, я также говорил о плавающей запятой. Я просто изменил свои данные примера

+0

По крайней мере, вы можете опустить автономный избыточный 'int (k)'. – deceze

+3

Никогда, никогда, никогда не делайте пустой 'except', и особенно никогда не делайте этого только для' pass'. –

+0

Редактировать: мой код не работает без исключения. Возникает ошибка в том, что следующий блок кода не был ограничен? – offeltoffel

ответ

3

Там нет никакого способа, чтобы использовать try/except пункты внутри списковых, но это может помочь:

a = ['2','3','4','5','Cherry'] 
print [int(x) for x in a if x.isdigit()] 

Выход:

['2', '3', '4', '5'] 

Update (как вопрос был обновлен):

Это может помочь, но я не знаю, насколько хорошо/точны, чтобы использовать его:

a = ['2.0','3.0','4.0','5.0', '44545.45', 'Cherry'] 

[float(x) for x in a if x.split('.')[0].isdigit() and x.split('.')[1].isdigit()] 

Выход:

[2.0, 3.0, 4.0, 5.0, 44545.45] 
+2

Не должно быть '[int (x) для x в a, если x.isdigit()]', поскольку OP хочет список целых чисел. – JRodDynamite

+1

Обратите внимание, что это не будет работать для отрицательных чисел, число с явным '+', например '' + 123'' и т. Д. – Holt

+0

Это было бы идеальным решением, но я должен был упомянуть, что список также содержит числа с плавающей запятой. Существует ли такая функция, как «x.isstr()»? Затем я мог бы добавить «if not x.isstr()» – offeltoffel

0

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

def is_number(k): 
    try: 
     float(k) 
    except ValueError: 
     return False 
    return True 

[int(float(k)) for k in a if is_number(k)] 
+1

'' 33'' не является экземпляром 'int'. – Holt

+0

ough, точно. спасибо за уведомление. –

0

Если вы хотите сжать try-except в одну линию, то я думаю, что ответ НЕТ и он ответил на here. Я бы пошел с микс regex и isinstance check-It захватывает все типы номеров, например. Поплавок, длинные, INT и комплексообразующих

>>>a=['2', '3', '4', '5', 'Cherry', '23.3', '-3'] 
>>>filter(bool,[i if isinstance(eval(i),(int, long, float, complex)) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)]) 
>>>['2', '3', '4', '5', '23.3', '-3'] 

Если вы хотите, чтобы захватить только floats -

>>>filter (bool,[i if isinstance(eval(i),float) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)]) 
>>>['23.3'] 

Если вы хотите, чтобы захватить только int -

>>>filter (bool,[i if isinstance(eval(i),int) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)]) 
>>>['2', '3', '4', '5', '-3'] 
Смежные вопросы