[Python-Dev] Re: PEP 218 (sets); moving set.py to Lib
Guido van Rossum
guido@python.org
Wed, 21 Aug 2002 01:23:15 -0400
> Now let's rewrite that in modern Python <wink>:
>
> def powerset(base):
> pairs = [(2**i, x) for i, x in enumerate(base)]
> for i in xrange(2**len(pairs)):
> yield [x for (mask, x) in pairs if i & mask]
Honest, I didn't see this before I posted mine. :-)
> > This is a generator that yields a series of lists whose values are the
> > items of base. And again, like cartesian product, it's now more a
> > generator thing than a set thing.
>
> Generators are great for constructing families of combinatorial
> objects, BTW. They can be huge, and in algorithms that use them as
> inputs for searches, you can often expect not to need more than a
> miniscule fraction of the entire family, but can't predict how many
> you'll need. Generators are perfect then.
Yup. That's why I strove for these to be generators.
> > BTW, the correctness of all my versions trivially derives from the
> > correctness of your version -- each is a very simple
> > transformation of the previous one. My mentor Lambert Meertens
> > calls this process Algorithmics (and has developed a mathematical
> > notation and theory for program transformations).
>
> Was he interested in that before his sabbatical with the SETL folks?
Dunno. Maybe it sparked his interest.
> The SETL project produced lots of great research in that area,
> largely driven by the desire to help ultra-high-level SETL programs
> finish in their lifetimes.
--Guido van Rossum (home page: http://www.python.org/~guido/)