Python: проверьте, можно ли преобразовать значение в int в понимании списка

В основном я хочу сделать это;

return [ row for row in listOfLists if row[x] is int ]

Но row[x] — это текстовое значение, которое может или не может быть преобразовано в целое число.

Я знаю, что это можно сделать с помощью:

try:
    int(row[x])
except:
    meh

Но было бы неплохо сделать это однострочным.

Любые идеи?


person Bolster    schedule 09.04.2011    source источник


Ответы (3)


Если вы имеете дело только с целыми числами, вы можете использовать str.isdigit():

Возвращает true, если все символы в строке являются цифрами и есть хотя бы один символ, иначе false.

[row for row in listOfLists if row[x].isdigit()]

Или, если отрицательные целые числа возможны (но должны быть разрешены):

row[x].lstrip('-').isdigit()

И, конечно же, все это работает только в том случае, если нет начальных или конечных пробельных символов (которые также можно удалить).

person Felix Kling    schedule 09.04.2011
comment
Только с неотрицательными целыми числами, поскольку - не является цифрой. Но это, пожалуй, лучшее решение, если оно работает. В противном случае регулярное выражение, допускающее - в начале, почти так же читабельно. - person ; 09.04.2011
comment
Не даст ли .lstrip('-') неверный (читай: abs) результат? Возможно, это не то, чего хочет ОП. - person ; 09.04.2011
comment
@delnan: это только для тестирования. Исходное значение сохраняется (или я не понимаю вашего комментария). - person Felix Kling; 09.04.2011
comment
Обратите внимание, что .lstrip('-') удалит несколько начальных дефисов, что приведет к выводу, что '--1' является допустимым числом. - person intuited; 09.04.2011

Как насчет использования регулярного выражения? (при необходимости используйте re.compile):

import re
...
return [row for row in listOfLists if re.match("-?\d+$", row[x])]
person tokland    schedule 09.04.2011

Or

return filter(lambda y: y[x].isdigit(), listOfLists)

или если вам нужно принимать отрицательные целые числа

return filter(lambda y: y[x].lstrip('-').isdigit(), listOfLists)

Каким бы забавным ни было понимание списка, в данном случае я нахожу его менее ясным.

person CoatedMoose    schedule 19.09.2012