> 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/)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4