Самый простой способ - просто использовать Underscore.js:
keys
_. keys (object) Извлечь все имена свойств объекта.
_. ключи ({один: 1, два: 2, три: 3}); => ["one", "two", "three"]
blockquote>Да, вам нужна дополнительная библиотека, но это так просто!
, Который, не только ужасно и медленный
, я оспаривал бы обоих.
А regex или другой строковый метод парсинга были бы более ужасными и медленнее.
я не уверен, что что-либо очень могло быть быстрее, чем вышеупомянутое. Это вызывает функцию и возвраты. Попытка/Выгода не представляет много служебное, потому что наиболее распространенное исключение поймано без обширного поиска стековых фреймов.
проблема - то, что любая числовая функция преобразования имеет два вида результатов
C (как пример) бездельничает это много путей. Python размечает его ясно и явно.
я думаю Ваш код для того, чтобы сделать, это прекрасно.
Кастинг для плавания и ловля ValueError является, вероятно, самым быстрым путем, так как плавание () конкретно предназначено для просто этого. Что-либо еще, что требует строкового парсинга (regex, и т.д.), вероятно, будет медленнее вследствие того, что он не настраивается для этой операции. Мои 0,02$.
В случае, если Вы ищете парсинг (положительный, неподписанный) целые числа вместо плаваний, можно использовать isdigit()
функция для строковых объектов.
>>> a = "03523"
>>> a.isdigit()
True
>>> b = "963spam"
>>> b.isdigit()
False
на строках Unicode существует также что-то, которые я не слишком знаком с , Unicode - десятичный/десятичный
то, Которое, не только является ужасным и медленным, кажется неуклюжим.
могут потребоваться некоторые привыкающие к, но это - pythonic способ сделать его. Как был уже указан, альтернативы хуже. Но существует еще одно преимущество выполнения вещей этот путь: полиморфизм.
центральная идея позади утиного ввода состоит в том, что, "если он идет и говорит как утка, затем это - утка". Что, если Вы решаете, что необходимо разделить строку на подклассы так, чтобы можно было измениться, как Вы определяете, может ли что-то быть преобразовано в плавание? Или что, если Вы решаете протестировать некоторый другой объект полностью? Можно сделать эти вещи, не имея необходимость изменять вышеупомянутый код.
Другие языки решают эти проблемы при помощи интерфейсов. Я сохраню анализ, которого решение лучше для другого потока. Точка, тем не менее, - то, что Python находится решительно на утке, вводящей сторону уравнения, и Вы, вероятно, оказываетесь перед необходимостью привыкать к синтаксису как это, если Вы планируете выполнение большого программирования в Python (но это не означает, что необходимо понравиться он, конечно).
Еще одна вещь Вы могли бы хотеть учесть: Python довольно быстр в броске и ловле исключений по сравнению с большим количеством других языков (30x быстрее, чем .NET, например). Heck, сам язык даже выдает исключения для передачи неисключительных, нормальных условий программы (каждый раз, когда Вы используете для цикла). Таким образом я не волновался бы слишком много об аспектах производительности этого кода, пока Вы не замечаете значительной проблемы.
Пользовательская функция помощника:
def if_ok(fn, string):
try:
return fn(string)
except Exception as e:
return None
тогда
if_ok(int, my_str) or if_ok(float, my_str) or if_ok(complex, my_str)
is_number = lambda s: any([if_ok(fn, s) for fn in (int, float, complex)])
Вот мой простой способ сделать это. Допустим, я просматриваю несколько строк и хочу добавить их в массив, если они окажутся числами.
try:
myvar.append( float(string_to_check) )
except:
continue
Замените myvar.apppend любой операцией, которую вы хотите выполнить со строкой, если окажется, что быть числом. Идея состоит в том, чтобы попытаться использовать операцию float () и использовать возвращенную ошибку, чтобы определить, является ли строка числом.
Обновлено после того, как Алфе указал, что вам не нужно отдельно проверять наличие числа с плавающей запятой, поскольку комплексные обрабатывают оба:
def is_number(s):
try:
complex(s) # for int, long, float and complex
except ValueError:
return False
return True
Ранее сказано: В некоторых редких случаях вам также может потребоваться проверка комплексных чисел (например, 1 + 2i), которые не может быть представлено числом с плавающей запятой:
def is_number(s):
try:
float(s) # for int, long and float
except ValueError:
try:
complex(s) # for complex
except ValueError:
return False
return True