[Tutor] advice on idiom replacing if test requested

Danny Yoo dyoo at hkn.eecs.berkeley.edu
Mon Dec 12 05:13:00 CET 2005



On Sun, 11 Dec 2005, Brian van den Broek wrote:

> I have a case like this toy code:
>
> import random
> list1 = [1,2,3]
> list2 = ['a', 'b', 'c']
> item = random.choice(list1 +list2)
> if item in list1:
>      others = list2
> else:
>      others = list1

Hi Brian,

This code works, and as long as you give it a good function name, I think
it's fine the way it is.

If we're concerned with efficiency, we might want to change the
random.choice() call to a random.randrange(), to avoid building the
concatenation of list1 and list2.  This looks like:

####
def sampleFromTwoLists(list1, list2):
    """Given two lists, returns a random element out of one of the lists
    as well as the other list."""
    index = random.randrange(len(list1) + len(list2))
    if index < len(list1):
        return list1[index], list2
    else:
         return list2[index - len(list1)], list1
####

Just out of curiosity, are you planning to do some kind of stratified
sampling with this?



> Another way occurred to me, but I wonder if I'm being too cute:
>
> item = random.choice(list1 +list2)
> others = [list1, list2][item in list1]

Too cute.  *grin* Although it's concise, I'm having a hard time reading
it.


Talk to you later!



More information about the Tutor mailing list