Searching for most pythonic/least stupid way to do something simple

nn pruebauno at latinmail.com
Wed Mar 17 10:29:31 EDT 2010



Michael Torrie wrote:
> david jensen wrote:
> > of course, changing nn's to:
> > def getOutcomes(myList=[2,5,8,3,5]):
> >    low_id = int(myList[0]>myList[1])
> >    amountToShare = 2*myList[low_id]
> >    remainder = myList[not low_id]-myList[low_id]
> >    tail=list(myList[2:])
> >    outcomes = [[amountToShare*perc, remainder+amountToShare*(1-perc)]+
> > tail for perc in (1.0, 0.75, 0.5, 0.25, 0.0)] if not low_id else
> > [[remainder+amountToShare*perc, amountToShare*(1-perc)]+ tail for perc
> > in (1.0, 0.75, 0.5, 0.25, 0.0)]
> >    return outcomes
> >
> >
> > works, just hides the ugliness in a more compact form
>
> If Gerard's code works, I would consider it far superior to your code
> here.  Pythonic does not necessarily mean short and ugly, nor does it
> mean that you have to always use list comprehensions.   Having a
> readable algorithm that's easy to follow in the future is a far better
> way than trying to use python's cool features to compact the code to as
> small and unreadable section as possible.
>
> I used to use list comprehension all the time, but I've found that often
> an explicit for loop is a much better solution in terms of
> maintainability.  Especially when you start seeing nested comprehensions
> such as you have here.

To be fair, that list comprehension was unnecessary complicated. The
following version does the same thing and still looks pretty
reasonable IMHO:

def getOutcomes(myList=[2,5,8,3,5]):
   low_id = int(myList[0]>myList[1])
   high_id = not low_id
   smaller = myList[low_id]
   bigger = myList[high_id]
   amountToShare = 2*smaller
   remainder = bigger-smaller
   remain0 = low_id*remainder
   remain1 = high_id*remainder
   tail = list(myList[2:])
   percents = (1.0, 0.75, 0.5, 0.25, 0.0)
   outcomes = [[remain0+amountToShare*perc, remain1+amountToShare*(1-
perc)]
               +tail for perc in percents]
   return outcomes



More information about the Python-list mailing list