Как удалять данные о списке strings и только оставлять данные, которые являются числами?

Сердечный привет:

У меня есть список strings следующей формы:

 l = ['hola como estas','3.4','5.7','mundo','6.7','cuesta 440$','9.8']

И я хочу удалить слова и оставить только числа, нечто похожее:

 L = ['3.4','5.7','6.7','9.8']

Или я схватил:

 L = [3.4 , 5.7, 6.7 , 9.8]

Как он мог бы делать это общим способом для любого списка, который появлялся бы с другими словами и другими положениями?

3
задан 21.04.2016, 20:02
2 ответа

По моему мнению самая простая форма он попробован делать превращение в float и отказываясь от остальных:

>>> l = ['hola como estas','3.4','5.7','mundo','6.7','cuesta 440$','9.8']
>>> l2 = []
>>> l3 = []
>>> for elem in l:
...     try:
...         l2.append(float(elem))
...     except ValueError:
...         l3.append(elem)
...
>>> l2
[3.4, 5.7, 6.7, 9.8]
>>> l3
['hola', 'mundo', 'python']

Таким образом он имеет в l2 список с числами и в l3 список с остальными, если он состоит в том, что ты нуждаешься в них для после.

Если ты нуждаешься в чем-то более общем, ты мог бы создавать функцию:

def es_numero(n):
    try:
        float(n)
    except ValueError:
        return False
    return True

Сейчас, ты мог бы использовать это:

>>> for elem in l:
...     if es_numero(elem):
...         l2.append(float(elem))
...     else:             
...         l3.append(elem)
...         
>>> l2
[3.4, 5.7, 6.7, 9.8]
>>> l3
['hola', 'mundo', 'python']

Если ты не нуждаешься в остальных элементах, ты мог бы использовать просто список comprehensión используя функцию es_numero:

>>> l2 = [float(num) for num in l if es_numero(num)]
>>> l2
[3.4, 5.7, 6.7, 9.8]

Или если ты хочешь стать более элегантным:

>>> l2 = map(float, filter(es_numero, l))
>>> l2
[3.4, 5.7, 6.7, 9.8]
6
ответ дан 24.11.2019, 14:33
  • 1
    Спасибо, он подал мне твой explicaci и # 243; n. –  Yeison Ordoñez 21.04.2016, 19:56
  • 2
    @YeisonOrdo и # 241; ez ничего, не забывай пометить ее, как принятая слева от моего вопроса, этой формы твой ответ остается как решенная. Привет! –  César 21.04.2016, 19:59
  • 3
    извинение не знало в любом случае большое спасибо. –  Yeison Ordoñez 21.04.2016, 22:54

Она tГ©cnica, что объяснил тебе @CГ©sar, - традиционная манера использовать строитель float, чтобы конвертировать с цепи до nГєmero. Но иногда идеальное, чтобы работать с nГєmeros установленной запятой, состоит в том, чтобы использовать тип decimal, чтобы не терять precisiГіn или чтобы мочь работать с nГєmeros больше или несовершеннолетние, чем он принимает тип double из C, на котором основывают float.

, Чтобы конвертировать список цепей в nГєmeros десятичные , мы можем делать это используя контекст ExtendedContext из следующего способа:

from decimal import (Decimal, localcontext, ExtendedContext)

l = ['hola como estas','3.4','5.7','mundo','6.7','cuesta 440 

И как результат:

[Decimal('3.4'),
 Decimal('5.7'),
 Decimal('6.7'),
 Decimal('9.8'),
 Decimal('1E+455'),
 Decimal('1.00000000000000002')]
,'9.8'] # Añadimos otras cadenas que podrían ser problemáticas con float l += ["infinity", "nan", "1e455", "1.00000000000000002"] with localcontext(ExtendedContext): l2 = [ x for x in (Decimal(s) for s in l) if x.is_finite() ] print(l2)

И как результат:

[Decimal('3.4'),
 Decimal('5.7'),
 Decimal('6.7'),
 Decimal('9.8'),
 Decimal('1E+455'),
 Decimal('1.00000000000000002')]
3
ответ дан 24.11.2019, 14:33