Python: попробуйте внутри укороченного цикла forloop

Предположим, я хочу преобразовать список строк в целое число, но это невозможно сделать для всех элементов.

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

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

Спасибо!

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


person offeltoffel    schedule 19.11.2015    source источник
comment
По крайней мере, вы можете опустить отдельный избыточный int(k).   -  person deceze♦    schedule 19.11.2015
comment
Никогда, никогда, никогда не делайте пустой except, и особенно никогда не делайте этого только для pass.   -  person Daniel Roseman    schedule 19.11.2015
comment
Изменить: мой код не работает без исключения. Возникает ошибка, что следующий блок кода не имеет отступа?   -  person offeltoffel    schedule 19.11.2015
comment
Вы уже нашли свое решение?   -  person SIslam    schedule 19.11.2015


Ответы (3)


Невозможно использовать предложения try/except внутри Списка понимания, но это может помочь:

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

Выход:

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

Обновление (поскольку вопрос был обновлен):

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

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]
person Andrés Pérez-Albela H.    schedule 19.11.2015
comment
Разве это не должно быть [int(x) for x in a if x.isdigit()], так как OP хочет список целых чисел. - person JRodDynamite; 19.11.2015
comment
Обратите внимание, что это не будет работать для отрицательных чисел, чисел с явным +, таких как '+123' и т. д. - person Holt; 19.11.2015
comment
Это было бы идеальным решением, но я должен был упомянуть, что список также содержит числа с плавающей запятой. Существует ли такая функция, как x.isstr()? Затем я мог бы добавить, если бы не x.isstr() - person offeltoffel; 19.11.2015
comment
@offeltoffel, да, ты должен. Теперь каждый ответ основан на целых числах. - person Andrés Pérez-Albela H.; 19.11.2015
comment
кажется, что для обновленного ответа это не сработает. Вы не можете сделать int('2.0'). - person Andrey Rusanov; 19.11.2015
comment
@Андрей: да, этого я тоже не знал, поэтому мне это не показалось важным - моя вина. Но все же я узнал кое-что новое, и с помощью этих ответов я смог улучшить свое решение. - person offeltoffel; 19.11.2015
comment
@offeltoffel Я обновил свой ответ. И, как я упоминаю, я не знаю, насколько это точно, но это работает для меня. - person Andrés Pérez-Albela H.; 19.11.2015

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

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

[int(float(k)) for k in a if is_number(k)]
person Andrey Rusanov    schedule 19.11.2015
comment
'33' не является экземпляром int. - person Holt; 19.11.2015

Если вы хотите сжать try-except в одну строку, я думаю, что ответ НЕТ, и на него есть ответ здесь. Я бы выбрал сочетание regex и isinstance check. Он фиксирует все типы чисел, например. float, long, int и complex-

>>>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']
person SIslam    schedule 19.11.2015