Pregunta La forma más rápida de dividir una cadena concatenada en una tupla e ignorar cadenas vacías


Tengo una cadena concatenada como esta:

my_str = 'str1;str2;str3;'

y me gustaría aplicar split función para ello y luego convertir la lista resultante a una tupla, y deshacerse de cualquier cadena vacía resultado de la split (observe el último ';' al final)

Hasta ahora, estoy haciendo esto:

tuple(filter(None, my_str.split(';')))

¿Hay alguna manera más eficiente (en términos de velocidad y espacio) para hacerlo?


10
2018-06-12 16:56


origen


Respuestas:


Esa es una forma muy razonable de hacerlo. Algunas alternativas:

  • foo.strip(";").split(";") (si no habrá ningún corte vacío dentro de la cadena)
  • [ x.strip() for x in foo.split(";") if x.strip() ] (para quitar el espacio en blanco de cada porción)

La forma "más rápida" de hacer esto dependerá de muchas cosas ... pero puedes experimentar fácilmente con ipython %timeit:

En [1]: foo = "1; 2; 3; 4;"

En [2]:% timeit foo.strip (";"). Split (";")
1000000 loops, lo mejor de 3: 1.03 us por loop

En [3]: filtro% timeit (Ninguno, foo.split (';'))
1000000 loops, lo mejor de 3: 1.55 us por loop

7
2018-06-12 16:59



¿Qué tal esto?

    tuple(my_str.split(';')[:-1])
    ('str1', 'str2', 'str3')

Usted divide la cadena en el ; carácter, y pasar todas las subcadenas (excepto la última, la cadena vacía) a tupla para crear la tupla de resultados.


11
2018-06-12 17:03



Si solo espera una cadena vacía al final, puede hacer:

a = 'str1;str2;str3;'
tuple(a.split(';')[:-1])

o

tuple(a[:-1].split(';'))

4
2018-06-12 17:02



Tratar tuple(my_str.split(';')[:-1])


3
2018-06-14 05:34



Sí, esa es una manera bastante pitonica de hacerlo. Si le gustan las expresiones del generador, también puede reemplazar el filter() con:

tuple(part for part in my_str.split(';') if part)

Esto tiene la ventaja de permitir un procesamiento adicional en cada parte en línea.

Es interesante observar que la documentación para str.split() dice:

... Si no se especifica sep o None, cualquier cadena de espacio en blanco es   separador y las cadenas vacías se eliminan del resultado.

Me pregunto por qué se hizo este caso especial, sin permitirlo para otros separadores ...


2
2018-06-12 17:02



use split y luego slicing:

 my_str.split(';')[:-1]

o:

lis=[x for x in my_str.split(';') if x]

1
2018-06-12 17:01