Python Module: nift

Chris Rebert clp2 at rebertia.com
Sun Feb 8 16:28:55 EST 2009


On Sun, Feb 8, 2009 at 12:57 PM, Paul McGuire <ptmcg at austin.rr.com> wrote:
> On Feb 8, 12:42 pm, J <seaworthyjer... at gmail.com> wrote:
>> What are your thoughts on this module I created?
>>
> Here are a few steps to illustrate some good basic Python idioms worth
> learning:
>
> Step 1: Replace many-branched if-elif with dict
>
> While translating characters in a string is a special case that
> usually warrants using str.translate, a more general-purpose technique
> to learn is to define a dict that captures the various branching
> options, and then use the selecting value as a key to access the
> desired branch.
> Here is a dict containing your branches:
>
> LEET_LETTERS = {
>    "e" : "3",
>    "E" : "3",
>    "a" : "4",
>    "A" : "4",
>    "i" : "1",
>    "I" : "1",
>    "t" : "7",
>    "T" : "7",
>    "s" : "5",
>    "S" : "5",
>    "o" : "0",
>    "O" : "0",
>    "b" : "8",
>    "B" : "8",
>    }
<snip>
> LEET_LETTERS is so space-consuming, sometimes it is easier to use the
> dict constructor with a list expression of list comprehension.  That
> is, instead of the built-in syntax P{}'s to define a dict, you can use
> the dict constructor and pass a list of (key,value) tuples.
>
> LEET_LETTERS = dict( [("E","3"), ("e","3"), ("A","4"),
> ("a","4"), ...] )
>
> Well, my fingers are tired and I'm bored already, how about if we
> could just list the two strings of key and value characters, and some
> how build the tuples by pulling an item from each list one at a time.
> Fortunately, that is what Python's zip() function does:
>
> LEET_LETTERS = dict( zip("eEaAiItTsSoObB",
>                         "33441177550088") )
>
> (I've listed the key-value pairs one above the other to illustrate how
> the mapping will work, but of course, that isn't required.)
>
> Now if I want to add another leet-speak letter (like "6" for "G"), I
> just add the two characters on the end of the two strings.

This I disagree with as being unnecessarily clever; the dict literal
is just fine as-is and the zip() makes it less clear. However, I would
definitely rewrite the dict to use less lines, which, after removing
the capital dupes (as I mentioned in my post, just use .lower()),
looks like:

LEET_LETTERS = {"e" : "3", "a" : "4", "i" : "1", "t" : "7", "s" : "5",
    "o" : "0", "b" : "8"}

which is better, IMHO.

Cheers,
Chris

-- 
Follow the path of the Iguana...
http://rebertia.com



More information about the Python-list mailing list