#python #string #list #python-2.7
#python #строка #Список #python-2.7
Вопрос:
Я ищу помощь в манипулировании списком строк, из которых я хочу извлечь цифры, такие как :
x = ['aa bb qq 2 months 60%', 'aa bb qq 3 months 70%', 'aa bb qq 1 month 80%']
Я пытаюсь добраться до :
[[2.0,60.0],[3.0,70.0],[1.0,80.0]]
элегантным образом.
Первое число всегда должно быть целым числом, но второе число может быть числом с плавающей запятой с десятичным значением
моя грязная работа заключается в следующем:
x_split = [y.replace("%", "").split() for y in x]
x_float = [[float(s) for s in x if s.isdigit()] for x in x_split]
Out[100]: [[2.0, 60.0], [3.0, 70.0], [1.0, 80.0]]
Комментарии:
1. Будут ли строки всегда заканчиваться на
%
?2. Поскольку вы конвертируете в
float
, есть ли вероятность появления нецелых чисел в строке? Всегда ли будет ровно два числа в строке?3. да, последнее число может составлять 70,5%!
Ответ №1:
Используйте регулярное выражение для сопоставления целых чисел и чисел с плавающей запятой.
import re
[[float(n) for n in re.findall(r'd .?d*', s)] for s in x]
Объяснение регулярного выражения ( r'd .?d*'
):
r # a raw string so that back slashes are not converted
d # digit 0 to 9
# one or more of the previous pattern (d)
. # a decimal point
? # zero or one of the previous pattern (.)
d # digit 0 to 9
* # zero or more of the previous pattern (d)
Комментарии:
1. Спасибо, смотрю на модуль re. Мой плохой, вопрос не был ясен, есть возможность десятичного числа.
2. можете ли вы быстро объяснить r’d .? d*’ Я действительно не знаком с re. Спасибо!
3. @StevenG: обновил ответ, чтобы объяснить регулярное выражение.