Учет списка, заменяющий элементы, которые не являются float или int

У меня есть список из 2-х предметов.

Примеры входов:

['19(1,B7)', '20(1,B8)'] ['16 Hyp', '16 Hyp'] ['< 3.2', '38.3302615548213'] ['18.6086945477694', '121.561539536844'] 

Мне нужно искать все, что есть float или int, и удалить его. Итак, мне нужен приведенный выше список:

 ['19(1,B7)', '20(1,B8)'] ['16 Hyp', '16 Hyp'] ['3.2', '38.3302615548213'] ['18.6086945477694', '121.561539536844'] 

Я написал код, чтобы найти «>» и разделил первый элемент, но я не уверен, как заменить мой «новый элемент» прежним:

Вот мой текущий код:

 def is_number(s): try: float(s) return True except ValueError: return False for i in range(0,len(result_rows)): out_row = [] for j in range(0,len(result_rows[i])-1): values = result_rows[i][j].split('+') for items in values: if '> ' in items: newItem=items.split() for numberOnly in newItem: if is_number(numberOnly): values.append(numberOnly) 

Результатом этого (print (values)) является

 ['< 3.2', '38.3302615548213', '3.2'] 

5 Solutions collect form web for “Учет списка, заменяющий элементы, которые не являются float или int”

Это больше похоже на истинный способ понимания списка, чтобы сделать то, что вы хотите …

 def isfloat(string): try: float(string) return True except: return False [float(item) for s in mylist for item in s.split() if isfloat(item)] #[10000.0, 5398.38770002321] 

Или удалите float() чтобы получить элементы как строки. Вы можете использовать это понимание списка только в том случае, если в строке найдены «>» или «<».

Как насчет

 def stip_chars(lst): for item in lst: yield item.strip("> ") new_values = [v for v in strip_chars(values) if is_number(v)] 

?

Если вы хотите изменить список на месте, а не создавать новый список, вы можете перебирать его, используя enumerate :

 for (list_index, item) in enumerate(values): if '> ' in item: values[list_index] = ' '.join(item_part for item_part in item.split() if is_number(item_part)) 

Или, тем не менее, вы хотите построить свое новое значение – я не уверен, что вы хотите, если у вас есть «5 6» в вашем исходном списке.

Если вам нужен новый список, вы можете сделать что-то подобное со списком.

 values = ['> 10000', '5398.38770002321'] print [filter(lambda s: s in '0123456789.', v) for v in values] 

ВОЗВРАТ:

 ['10000', '5398.38770002321'] 

Список строк, по запросу.

И сделать это функцией:

 def parse_number(value): return [filter(lambda s: s in '0123456789.', v) for v in values] print parse_number(values) 

В качестве дополнительного бонуса принятие этих отрицательных чисел будет таким же простым, как добавление дефиса в строку с '0123456789.-' списком '0123456789.-'

Итераторы хорошо работают здесь:

 def numbers_only(l): for item in l: if '> ' in item: item = item.split()[1] try: yield float(item) except ValueError: pass 
 >>> values = ['> 10000', '5398.38770002321'] >>> list(numbers_only(values)) [10000.0, 5398.38770002321] 

Как правило, проще создать новый список, чем для итерации и изменения старого списка

  • Как преобразовать некоторый символ в пятизначный unicode в Python 3.3?
  • winpdb не работает с python 3.3
  • Bash alias -> Python 2.7 to Python 3.3
  • Python принимает аргументы ключевых слов в функциях CPython?
  • Передача пути библиотеки в качестве аргумента командной строки для setup.py
  • Массовая анимация Matplotlib
  • конвертировать список списков в строку
  • Не удается запустить сценарий Pygame, который воспроизводит файл OGG, скомпилированный с помощью cx_Freeze
  • Python - лучший язык программирования в мире.