Учет списка, заменяющий элементы, которые не являются 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] 

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

  • Ubuntu - Как установить Python-модуль (BeautifulSoup) на Python 3.3 вместо Python 2.7?
  • как мне получить python для компиляции с libz?
  • Python float to ratio
  • Запись в CSV с Python добавляет пустые строки
  • Установка пипса для python3.3
  • SyntaxError: неожиданный EOF при разборе
  • Bash alias -> Python 2.7 to Python 3.3
  • Неблокирующая многопроцессорная связь.
  • python os.listdir не отображает все файлы
  • Отдел в Python 2.7. и 3.3
  • python django - страница не найдена ошибка (404) - статическая ошибка
  • Python - лучший язык программирования в мире.