2015-06-10 3 views
-3

У меня есть список, содержащий строки с обеих букв, символов и цифр и:Как удалить строки, содержащие буквы из списка?

list = ['hello', '2U:', '-224.3', '45.1', 'SA 2'] 

Я хочу, чтобы только сохранить номера в списке и конвертировать их в float значения. Как я могу это сделать? Я хочу, чтобы этот список, чтобы выглядеть следующим образом:

list = ['-224.3'. '45.1'] 

Список создается, когда я делаю serial.readline() из Arduino, который дает мне строку, состоящую из команд и точек данных. Так я выглядел следующим образом:

'hello,2U:,-224.3,45.1,SA 2' 

Я сделал list.split (Разделитель = «»), и хотел только точки данных для будущих расчетов.

+0

Что вы хотите, чтобы произойти с элементами, содержащими как числа, так и буквы? Должны ли буквы удаляться и возвращаемая часть числа или если весь элемент будет выброшен? То есть does '2U:' return 2 или он полностью исключен из результатов? – Seth

+0

Посмотрите на [this] (https://stackoverflow.com/questions/30238598/python-how-to-separate-list-based-on-numerical-values-and-strings-from-a-given) вопрос он, похоже, очень похож на ваш. – EpsilonX

+0

@EpsilonX. Разница заключается в следующем: в этом другом вопросе цифры _actual_ numbers, поэтому все ответы используют какой-то «isinstance» для тестирования. Здесь это не сработает. –

ответ

2

вероятно, лучший способ, чтобы увидеть, является ли строка может быть приведен к float - это просто try, чтобы бросить его.

res = [] 
for x in lst: 
    try: 
     res.append(float(x)) 
    except ValueError: 
     pass 

После res является [-224.3, 45.1]

Вы могли также сделать этот список понимание, что-то вроде [float(x) for x in lst if is_float(x)], но для этого вам потребуется функция is_float, которая по существу будет делать то же самое: Попробуйте поместите его как float и верните True, иначе верните False. Если вам это нужно всего один раз, цикл будет короче.

+0

Это было именно то, что мне нужно. благодаря –

0

Вы можете попробовать что-то вроде ниже -

def isNum(s): 
    try: 
      float(s) 
      return True 
    except ValueError: 
      return False 
lst = ['hello', '2U:', '-224.3', '45.1', 'SA 2'] 
bools = list(map(lst,isNum)) 
deleted = 0 
for idx, val in enumerate(bools): 
    if val: 
      continue 
    else: 
      del lst[idx-deleted] 
      deleted = deleted + 1 

EDIT:

Или вы можете использовать

def isNum(s): 
    try: 
      float(s) 
      return True 
    except ValueError: 
      return False 
lst = ['hello', '2U:', '-224.3', '45.1', 'SA 2'] 
lst = list(filter(isNum, lst)) 
+1

Или просто 'lst = filter (isNum, lst)'? –

+0

Добавлено, спасибо. –

Смежные вопросы