programming multiple into functional delimiters python string parsing functional-programming

multiple - reduce python



lista dividida de la cadena del mapa de Python (5)

Así es como lo hago:

>>> a=[''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21''] >>> map(str.split, a) [[''2011-12-22'', ''46:31:11''], [''2011-12-20'', ''20:19:17''], [''2011-12-20'', ''01:09:21'']]

Esto solo funciona cuando sabes que tienes una lista de str (es decir, no solo una lista de cosas que implementan el método split de una manera compatible con str ). También se basa en el uso del comportamiento predeterminado de split() , que se divide en cualquier espacio en blanco, en lugar de usar x.split('' '') , que se divide solo en caracteres de espacio (es decir, no en pestañas, nuevas líneas u otros espacios en blanco), porque No puedo pasar otro argumento usando este método. Para un comportamiento de llamada más complejo que este, usaría una lista de comprensión.

Estoy tratando de asignar la función str.split a una matriz de cadena. a saber, me gustaría dividir todas las cadenas en una matriz de cadenas que siguen el mismo formato. ¿Alguna idea de cómo hacer eso con el map en python? Por ejemplo, supongamos que tenemos una lista como esta:

>>> a = [''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21'']

desea dividir las cadenas por espacio (dividir ("")) usando map para tener una lista como:

>>> [[''2011-12-22'', ''46:31:11''], [''2011-12-20'', ''20:19:17''], [''2011-12-20'', ''01:09:21'']]


Aunque no es muy conocido, hay una función diseñada solo para este propósito, operator.methodcaller :

>>> from operator import methodcaller >>> a = [''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21''] >>> map(methodcaller("split", " "), a) [[''2011-12-22'', ''46:31:11''], [''2011-12-20'', ''20:19:17''], [''2011-12-20'', ''01:09:21'']]

Esta técnica es más rápida que los enfoques equivalentes utilizando expresiones lambda.


Usa el map en conjunción con una función. Una buena manera es usar una función lambda :

>>> a=[''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21''] >>> map(lambda s: s.split(), a) [[''2011-12-22'', ''46:31:11''], [''2011-12-20'', ''20:19:17''], [''2011-12-20'', ''01:09:21'']]


map(lambda x: x.split(), a) pero, usando una lista de comprensión [x.split() for x in a] es mucho más claro en este caso.


Comunidad wiki responde para comparar otras respuestas dadas

>>> from timeit import Timer >>> t = {} >>> t[''methodcaller''] = Timer("map(methodcaller(''split'', '' ''), a)", "from operator import methodcaller; a=[''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21'']") >>> t[''lambda''] = Timer("map(lambda s: s.split(), a)", "a = [''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21'']") >>> t[''listcomp''] = Timer("[s.split() for s in a]", "a = [''2011-12-22 46:31:11'',''2011-12-20 20:19:17'', ''2011-12-20 01:09:21'']") >>> for name, timer in t.items(): ... print ''%s: %.2f usec/pass'' % (name, 1000000 * timer.timeit(number=100000)/100000) ... listcomp: 2.08 usec/pass methodcaller: 2.87 usec/pass lambda: 3.10 usec/pass