retirer les nombres entiers d'une liste
Bonjour à tous,
Contexte : Je programme actuellement un script ayant pour but d'identifier des éléments précis dans un fichier CAO de type IGES. Dans ce type de fichier, chaque ligne définit une entité (une ligne, un cercle...) et pour reconnaitre les entités, je dois identifier leurs coordonnées. J'ai donc utilisé readline(), puis strip afin de la transformer en liste (ça marche très bioen jusque là mais après, je bloque).
Mon problème : dans la liste, il y a des entiers (des caractéristiques des entités qui ne m'intéressent pas - couleur, style...) et les coordonnées X Y Z sous forme de réels (1542.1203, 45544.126, 1.205). Comment puis-je retirer de la liste tous les entiers et ne garder que les réels?
Exemple :
liste originale : ['128', '5', '1', '123.6067977', '723.4654977','1', '5', '1', '0', '0', '43.2137977', '3.601277', '223.1067977', '445.12377']
liste "filtrée" : ['123.6067977', '723.4654977', '43.2137977', '3.601277', '223.1067977', '445.12377']
J'espère être clair.
Merci d'avance,
Fred
solution mdriesbach amelioree
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from timeit import Timer
import re
ch = '128 5677 1 123.6067977 723.4654977 1 544 1\n0 0 43.2137977 2.456 3 \n4.678 145.78 3.601277 223.1067977 445.12377'
lst = ch.split()
pat = re.compile('\d+\.{1}\d+|\\n')
def ey(lst):
return [ chel for chel in lst if pat.match(chel)]
def ey2(lst):
return [ pat.findall(chel) for chel in ch.splitlines() ]
def dries(lst):
return [elem for elem in lst if "." in elem ]
def dries2(lst):
return [ [el for el in elemen.split() if '.' in el] for elemen in ch.splitlines() ]
iterations = 10000
tey = Timer('ey(lst)','from __main__ import ey,lst').timeit(iterations)
tey2 = Timer('ey2(lst)','from __main__ import ey2,lst').timeit(iterations)
tdries = Timer('dries(lst)','from __main__ import dries,lst').timeit(iterations)
tdries2 = Timer('dries2(lst)','from __main__ import dries2,lst').timeit(iterations)
print '\navec re\n',ey(lst)
print tey
print '\navec in\n',dries(lst)
print tdries,' secondes'
print '\n\n\navec re 2\n',ey2(lst)
print tey2
print '\navec in 2\n',dries2(lst)
print tdries2,' secondes' |
Citation:
avec re
['123.6067977', '723.4654977', '43.2137977', '2.456', '4.678', '145.78', '3.601277', '223.1067977', '445.12377']
2.00179352404
avec in
['123.6067977', '723.4654977', '43.2137977', '2.456', '4.678', '145.78', '3.601277', '223.1067977', '445.12377']
0.562109988839 secondes
avec re 2
[['123.6067977', '723.4654977'], ['43.2137977', '2.456'], ['4.678', '145.78', '3.601277', '223.1067977', '445.12377']]
1.392408253
avec in 2
[['123.6067977', '723.4654977'], ['43.2137977', '2.456'], ['4.678', '145.78', '3.601277', '223.1067977', '445.12377']]
0.750108742871 secondes
La solution avec if '.' in reste la plus rapide.