Reemplace espacios en cadena -- python campo con strings campo con complexity camp codereview Relacionados El problema

Replace spaces in string


0
vote

problema

Español
  import re   def replace_token_regex(s, token=" "):     return re.sub(token, '20%', s.strip())  def replace_token_inplace(s, token=" "):      for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%'     return s  print replace_spaces_regex("Foo Bar ") s = list("Foo Bar ") replace_spaces_inplace(s) print ''.join(s)   

La complejidad de tiempo de ejecución del código anterior es $ O (n) $, ¿puede optimizarse aún más? ¿O hay alguna mejor manera de hacer el cálculo anterior?

Original en ingles
import re   def replace_token_regex(s, token=" "):     return re.sub(token, '20%', s.strip())  def replace_token_inplace(s, token=" "):      for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%'     return s  print replace_spaces_regex("Foo Bar ") s = list("Foo Bar ") replace_spaces_inplace(s) print ''.join(s) 

The run time complexity of the above code is \$O(n)\$, can it be further optimized? or is there any better way to do the above computation?

        
     
     

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Si desea evitar replace , un método más rápido se dividiría y se unirá. Esto es más rápido simplemente porque .split1 y .join son rápidos:

  "20%".join(string.split(" "))   

Para una revisión más completa, señalaré que sus funciones no son equivalentes. Las primeras tiras en blanco y el segundo no. ¡Uno de ellos debe estar equivocado!

en el segundo caso:

  def replace_token_inplace(s, token=" "):     for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%'     return s   

Estás haciendo varias cosas no idiomáticas. Para uno, estás mutando y devolviendo una lista. Es mejor simplemente no devolverlo si muta:

  def replace_token_inplace(s, token=" "):     for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%'   

En segundo lugar, probablemente sea más rápido hacer una transformación de copia:

  def replace_token_inplace(s, token=" "):     for char in s:         if ord(char) == ord(token):             yield '20%'         else:             yield char   

que también se puede escribir

  def replace_token_inplace(s, token=" "):     for char in s:         yield '20%' if ord(char) == ord(token) else char   

o incluso

  def replace_token_inplace(s, token=" "):     return ('20%' if ord(char) == ord(token) else char for char in s)   

Si desea devolver una lista, use los corchetes en lugar de las rondas.

 

If you want to avoid replace, a faster method would just split and join. This is faster simply because .split and .join are fast:

"20%".join(string.split(" ")) 

For a more thorough review, I'll point out that your functions aren't equivalent. The first strips whitespace and the second doesn't. One of them must be wrong!

In the second case:

def replace_token_inplace(s, token=" "):     for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%'     return s 

you are doing several non-idiomatic things. For one, you are mutating and returning a list. It's better to just not return it if you mutate:

def replace_token_inplace(s, token=" "):     for index, char in enumerate(s):         if ord(char) == ord(token):             s[index] = '20%' 

Secondly, it'll probably be faster to do a copying transform:

def replace_token_inplace(s, token=" "):     for char in s:         if ord(char) == ord(token):             yield '20%'         else:             yield char 

which can also be written

def replace_token_inplace(s, token=" "):     for char in s:         yield '20%' if ord(char) == ord(token) else char 

or even

def replace_token_inplace(s, token=" "):     return ('20%' if ord(char) == ord(token) else char for char in s) 

If you want to return a list, use square brackets instead of round ones.

 
 
0
 
vote

¿Por qué no usar la función estándar de Python:

  "Foo Bar ".replace("20%"," ")   

Está incorporado, por lo que los expertos han optimizado lo más posible.

 

Why not use the Python standard function:

"Foo Bar ".replace("20%"," ") 

It's built-in, so experts have optimised this as much as possible.

 
 
   
   

Relacionados problema

7  Compruebe la consistencia de una lista de declaraciones, con coincidencia de rima difusa  ( Check consistency of a list of statements with fuzzy rhyme matching ) 
Hice un programa hoy que resuelve lo siguiente problema en un sitio de competencia de programación (Open.Kattis.com) : verifique si todas las declaraciones c...

4  Tour de Knights - Algo que estoy haciendo mal  ( Knights tour something i am doing wrong ) 
Tengo una tarea para escribir un programa de backtracking de Knights Tour en Java donde dice el profesor a: Eliminar el tiempo de retroceso por: Find the...

7  Un algoritmo de partición para enteros positivos  ( A partition algorithm for positive integers ) 
He encontrado el siguiente problema que encontré muy interesante para resolver: Dada una matriz de enteros positivos {A1, A2, ..., A} Se requiere para pa...

7  Encontrar trillizos únicos agregando hasta 0  ( Finding unique triplets adding up to 0 ) 
Estoy trabajando en un problema "3Sum", en el que, dado una matriz var lastName = Request.Params["lastName"] ?? ""0 de var lastName = Request.Params["lastN...

2  Tiempo de alta ejecución en el programa de partición numérico en Python 2.7  ( High execution time on number partitioning program in python 2 7 ) 
Estoy escribiendo un programa para contar solo las particiones de un número con distinta partes . Estoy usando un enfoque de abajo hacia arriba para la progr...

2  Optimización del código para la secuencia A064604  ( Optimizing code for sequence a064604 ) 
Estoy implementando a064604 - oeis para enteros positivos de hasta 10 mil millones. Estoy encontrando a los divisores en $ o ( sqrt n) $. Por lo tanto, ...

2  HackerRank: Rotación de la matriz izquierda en Python  ( Hackerrank left array rotation in python ) 
Aquí está el problema en Hackerrank . Quiero saber cómo puedo mejorar este código. Estoy tratando principalmente de mejorar las siguientes habilidades: la do...

5  Números psicosicos y ordinarios  ( Psycho and ordinary numbers ) 
La declaración del problema se puede encontrar aquí . En resumen, aquí es cuál es el problema sobre: ​​ Se le da un conjunto de números y necesita encontra...

4  Python Encuentra todos los subconjuntos adyacentes del conjunto de monedas que tienen una minoría de colas  ( Python find all adjacent subsets of set of coins which have a tails minority ) 
Dada una secuencia de cabezas y colas, quiero encontrar cuántas subsiguientes significativas hay en esta secuencia donde el número de cabezas no es menor que ...

-1  Encontrar la distancia desde cada elemento de matriz a la entrada cero más cercana  ( Finding the distance from each array element to the nearest zero entry ) 
Escribí un programa, que obtiene una cierta matriz y reemplaza cada valor en la matriz con la distancia de ella al valor cero más cercano. La complejidad del ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos