list comprehensions *are* nice

Hannah Schroeter hannah at schlund.de
Tue May 15 10:32:33 EDT 2001


Hello!

In article <9dqd05$bp4 at gap.cco.caltech.edu>,
Nathan Gray <n8gray at caltech.edu.is.my.e-mail.address> wrote:

>[...]

>def qsort(lst):
>    if len(lst) <= 1: return lst
>    return qsort([lessthan for lessthan in lst[1:] if lessthan < lst[0]]) +
>\
>            [lst[0]] + qsort([grtreq for grtreq in lst[1:] if grtreq >=
>lst[0]])

>Take that, Haskell!  List comprehensions are rad.

Literal translation to Haskell:

qsort lst =
  if length lst <= 1
  then lst
  else qsort [lessthan | lessthan <- tail lst, lessthan < head lst]
    ++ [head lst]
    ++ qsort [grtreq | grtreq <- tail lst, grtreq >= head lst]

Now some CSE on "head lst", "tail lst"

qsort lst =
  if length lst <= 1
  then lst
  else qsort [lessthan | lessthan <- tl, lessthan < hd]
    ++ [hd]
    ++ qsort [grtreq | grtreq <- tl, grtreq >= hd]
 where
  hd = head lst
  tl = tail lst

Now do it with more than one equation and pattern matching:

qsort lst | length lst <= 1 = lst
qsort (hd:tl) =
  qsort [lessthan | lessthan <- tl, lessthan < hd]
  ++ [hd]
  ++ qsort [grtreq | grtreq <- tl, grtreq >= hd]

Now, [x] ++ foo === x:foo, which is a bit more efficient, thus

qsort lst | length lst <= 1 = lst
qsort (hd:tl) =
  qsort [lessthan | lessthan <- tl, lessthan < hd]
  ++ hd : qsort [grtreq | grtreq <- tl, grtreq >= hd]

facit: people accustomed to Haskell *might* miss pattern matching/
multiple heads for the same functions/function guards a bit in Python.

Kind regards,

Hannah.



More information about the Python-list mailing list