Say I have a string that looks like this:
str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"
You’ll notice a lot of locations in the string where there is an ampersand, followed by a character (such as “&y” and “&c”). I need to replace these characters with an appropriate value that I have in a dictionary, like so:
dict = {"&y":"\033[0;30m",
"&c":"\033[0;31m",
"&b":"\033[0;32m",
"&Y":"\033[0;33m",
"&u":"\033[0;34m"}
What is the fastest way to do this? I could manually find all the ampersands, then loop through the dictionary to change them, but that seems slow. Doing a bunch of regex replaces seems slow as well (I will have a dictionary of about 30-40 pairs in my actual code).
Any suggestions are appreciated, thanks.
Edit:
As has been pointed out in comments throught this question, my dictionary is defined before runtime, and will never change during the course of the applications life cycle. It is a list of ANSI escape sequences, and will have about 40 items in it. My average string length to compare against will be about 500 characters, but there will be ones that are up to 5000 characters (although, these will be rare). I am also using Python 2.6 currently.
Edit #2
I accepted Tor Valamos answer as the correct one, as it not only gave a valid solution (although it wasn’t the best solution), but took all others into account and did a tremendous amount of work to compare all of them. That answer is one of the best, most helpful answers I have ever come across on StackOverflow. Kudos to you.
I took the liberty of comparing a few solutions:
Results in Python 2.6
Both claudiu’s and andrew’s solutions kept going into 0, so I had to increase it to 10 000 runs.
I ran it in Python 3 (because of unicode) with replacements of chars from 39 to 1024 (38 is ampersand, so I didn’t wanna include it). String length up to 10.000 including about 980 replacements with variable random inserts of length 0-20. The unicode values from 39 to 1024 causes characters of both 1 and 2 bytes length, which could affect some solutions.
Results:
(** Note that gnibbler’s code uses a different dict, where keys don’t have the ‘&’ included. Andrew’s code also uses this alternate dict, but it didn’t make much of a difference, maybe just 0.01x speedup.)