
On Thu, 23 Jul 2009 04:28:33 pm Andy Kish wrote:
Hi all,
I think the addition of a universal set object would be a nice touch for python sets.
But you can't have a universal set until you know what the problem domain is. If the problem domain is citrus fruits, then the universal set is: {lemons, limes, grapefruits, oranges, mandarins, tangelos, kumquats, ... } If the problem domain is Presidents of the USA, then the universal set is: {Washington, Lincoln, Bush, Clinton, Obama, Wilson, ... } If the problem domain is integers, then it is {0, 1, -1, 2, -2, 3, -3, ...} The first two are finite, the third is infinite.
Manipulation of collections of sets becomes much easier with it. Right now, certain operations are easy because empty sets are easy to create while the dual operation requires special cases:
set_union = set() for s in sets: set_union |= s
Better written as:
reduce(operator.or_, [set([1, 2, 3]), set([2, 4, 5])]) set([1, 2, 3, 4, 5])
# this doesn't work set_intersection = set(???) for s in sets: set_intersection &= s
But this does:
reduce(operator.and_, [set([1, 2, 3]), set([2, 4, 5])]) set([2])
Implementation of a universal set would be pretty trivial.
You think so? I can think of a number of problems. (1) What elements should go into the universal set? Strings, ints, floats, presidents... ? (2) What is len(set.universal())? (3) What does set.universal() print? (4) What does set.universal().clear() do? (5) For that matter, union(), copy(), difference(), issubset(), etc? (The universal set for strings of length one is a subset of the universal set for all strings.) I don't think there is a suitable solution for all of these issues. That would mean that set.universal() can't be a real set object, it has to be some sort of not-quite-a-set object that doesn't provide the entire set interface. -- Steven D'Aprano