2016-10-04 1 views
1

ich die Suche nach Hilfe bei der Manipulation eine Liste von Strings, wo ich extrahieren mag die Ziffern so hat enthalten:Manipulation einer Liste von Strings Ziffern zur Ausgabe eine Liste von Ziffern

x = ['aa bb qq 2 months 60%', 'aa bb qq 3 months 70%', 'aa bb qq 1 month 80%'] 

Ich versuche zu bekommen zu:

[[2.0,60.0],[3.0,70.0],[1.0,80.0]] 

in einer eleganten Art und Weise.

Die erste Zahl sollte immer eine ganze Zahl sein, aber die zweite Zahl kann ein Schwimmer mit einem Dezimalwert sein um

meine schmutzige Arbeit ist dies:

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]] 
+0

Wird in '%' die Saiten immer enden? –

+0

@ Farhan.K immer –

+0

Da Sie zu Float konvertieren, gibt es keine Chance, nicht-ganze Zahlen in der Zeichenfolge auftreten? Wird es immer genau zwei Zahlen pro String geben? –

Antwort

7

Verwenden Sie eine regular expression ganzen Zahlen und Schwimmer entsprechen .

import re 
[[float(n) for n in re.findall(r'\d+\.?\d*', s)] for s in x] 

Erklärung für die regex (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) 
+0

Danke, schau dir das Modul an. Meine schlechte, Frage war nicht klar, es gibt eine Möglichkeit der Dezimalzahl. –

+0

können Sie schnell erklären, die r '\ d + \.? \ D *' Ich bin wirklich unfamiliarare mit re. Vielen Dank! –

+0

@StevenG: Die Antwort wurde aktualisiert, um den regulären Ausdruck zu erklären. –

Verwandte Themen