Grooooops wrote:
> Hi All,
> 
> I've been lurking the list for a month and this is my first post. I am
> hoping this post is appropriate here, otherwise, my apologies.
> 
>  I'm somewhat new to Python, (I'm reading all the tutorials I can find,
> and have read through Andre Lessa's Developers Handbook.)
> I am trying to learn the Python way of thinking as well as the syntax.
> 
> I popped this bit of code together for fun, based on a previous post
> regarding randomizing a word.
> This shuffles a word, then splits out the vowels and then reassembles
> it with the vowels interpolated between consonants.
> (To create plausible sounding gibberish)

To make it short, my version is:

import random
def reinterpolate2(word, vocals='aeiouy'):
    wlist = list(word)
    random.shuffle(wlist)
    vees = [c for c in wlist[::-1] if c in vocals]
    cons = [c for c in wlist[::-1] if c not in vocals]
    short, long = sorted((cons, vees), key=len)
    return ''.join(long[i] + short[i] for i in range(len(short))) + 
''.join(long[len(short):])


> The code just seems kind of bulky to me. I am wondering, is this an
> efficient way to do things, or am I making things harder than
> necessary?

Some comments on your code:

> #--------------------------begin code------------------
> """scrambles a word, but creates plausable gibberish"""
> import random
> def shuffled(s):
>         """ scrambles word"""
>       l = list(s)
>       random.shuffle(l)
>       return ''.join(l)

You can define this function separately, but needn't.

> def contains(alist,b):
>         """...is letter b in list a..."""
>       ret = []
>       for all in alist:
>               #print all
>               if all==b:
>                       return 1
>       return 0

That is entirely unnecessary - use "b in alist" :)

> def newZip(a1,a2):
>         """ reassemble """
>       l1=len(a1)
>       l2=len(a2)
> 
>       longest = [a1,a2][l1<l2]
>       shortest = [a1,a2][longest == a1]
>       diff = max(l1,l2)-min(l1,l2)

diff = abs(l2-l1) would be shorter.

>       #print longest
>       seq = len(longest)
>       ret = ""
>       for j in range(seq):
>               if len(longest)>0:
>                       ret = ret + longest.pop()

ret += longest.pop() comes to mind.

>               if len(shortest)>0:
>                       ret = ret + shortest.pop()
>       return ret
> 
> def reinterpolate(word):
>         """ main function """
>       wlist = shuffled(list(word))

shuffled() will make a list itself, so list() is superfluous here.

>       vlist = list('aeiouy') # ok, y isn't really a vowel, but...
>       vees = filter(lambda x: contains(vlist,x),wlist)

Use a list comprehension here, like above.

>       cons =  filter(lambda x: not(contains(vlist,x)),wlist)
>       a=list(vees)
>       b=list(cons)
>       return newZip(a,b)
> 
> word = "encyclopedia"
> print reinterpolate(word)
> 
> #-------------------------------end code---------------------------
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to