1
votes

I'm pretty new to python, so forgive me if I am missing an obvious built-in function.

I have a dictionary mapping I generated like the following:

dictionary = dict(zip(restAlphaSet,list(item)))

where restAlphaSet it a string and list(item) is list converted iteration

I am trying to use this to replace all the characters in my string. I found a replaceAll function online that looks like the following:

def replace_all(text, dic):
for i, j in dic.iteritems():
    if i != j:
        text = text.replace(i, j)
return text

Unfortunately, this is flawed as if the mapping has a->b, b->a, then nothing would get changed as the b's would be changed back to the a's.

I found the translate function, but it doesn't accept a dictionary input.

3
What about removing the b -> a mappings? - cfedermann
There's a syntax error in your example function. If i!=j needs a colon at the end, else it will generate a SyntaxError. - Joel Cornett
First it will fail with IndentationError :) - Lev Levitsky
its very similar to a cryptogram. So letters can be mapped to any other letter (no dupliactes), I just need an order independent function. And ya I copied bad, i'll add colon - NickG
translate does accept dicts if applied to unicode objects (see docs.python.org/library/stdtypes.html#str.translate) - georg

3 Answers

6
votes

Translations are way faster.

>>> import string
>>> text.translate(string.maketrans("".join(restAlphaSet),"".join(item)))
4
votes

You are overlooking the translate function. See here for a usage example.

-3
votes

I realize it is an old question, however it seems there was no answer using dictionary with mapping for both a->b and b->a.

I needed a similar function, and the trick that did a job was to first iterate over the string in which we need replacement and then for each char to look for a mapping.

def replace_all(text, dic):
    new_text = ""
    for char in text:
        for i, j in dic.iteritems():
            if char == i:
                new_text += j
return new_text