Обычный способ проверить, может ли что-то быть превращена в int
является try
его и увидеть, следуя принципу EAFP :
try:
int_value = int(string_value)
except ValueError:
# it wasn't an int, do something appropriate
else:
# it was an int, do something appropriate
Таким образом, в вашем случае:
for item in mylist:
try:
int_value = int(item)
except ValueError:
pass
else:
mynewlist.append(item) # or append(int_value) if you want numbers
В большинстве случаев, петля вокруг некоторых тривиального кода, который заканчивается mynewlist.append(item)
может быть превращена в списке понимание, выражение генератора, или позвонить в map
или filter
. Но здесь вы не можете, потому что нет никакого способа поставить try
/except
в выражение.
Но если обернуть его в функции, вы можете:
def raises(func, *args, **kw):
try:
func(*args, **kw)
except:
return True
else:
return False
mynewlist = [item for item in mylist if not raises(int, item)]
... или, если вы предпочитаете:
mynewlist = filter(partial(raises, int), item)
Это очиститель использовать его таким образом:
def raises(exception_types, func, *args, **kw):
try:
func(*args, **kw)
except exception_types:
return True
else:
return False
Таким образом, вы можете передать его ex (или кортеж исключений), который вы ожидаете, и те вернут True
, но если есть неожиданные исключений, то они будут распространяться. Итак:
mynewlist = [item for item in mylist if not raises(ValueError, int, item)]
... будет делать то, что вы хотите, но:
mynewlist = [item for item in mylist if not raises(ValueError, item, int)]
... поднимет TypeError
, как это должно быть.
Стоит отметить, что 'str.isdigit()' будет возвращать 'True' на некоторые вещи, которые будут генерировать исключения при передаче через' int() 'и' False' на некоторые вещи, которые не будут. Например: номера надстрочных номеров, «+1». –
@Lattyware Можете ли вы привести пример значений, которые могут вызвать исключение? – satoru
«²» - надстрочный разряд 2. Он возвращает 'True' из' str.isdigit() ', но' int ("²") 'будет вызывать' ValueError'. В обратном порядке '' +1 "' будет синтаксически разбираться, но 'str.isdigit (" + 1 ")' вернет 'False'. –