манипулирование списком строк, содержащих цифры, для вывода списка цифр

#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: обновил ответ, чтобы объяснить регулярное выражение.