
On Tue, Nov 3, 2009 at 12:20 AM, Yuvgoog Greenle ubershmekel@gmail.com wrote:
On Tue, Nov 3, 2009 at 12:19 AM, Greg Ewing greg.ewing@canterbury.ac.nz wrote:
Cameron Simpson wrote:
Personally, I'm for the iteration spec in a lot of ways.
Firstly, a .get()/.pick() that always returns the same element feels horrible. Is there anyone here who _likes_ it?
State might cause people to use this to iterate which would be just plain wrong. The 2 things I have a bad feeling about is:
- random.choice could be a pythonic alternative to what some have mentioned
here but it doesn't work on sets. The following code raises TypeError: 'set' object does not support indexing: import random random.choice(set([1,2,3,4,5,6]))
There is a huge difference between picking a random element of a set and picking an arbitrary one. Algorithms that need randomness *must* use the random generator (and because the hash table implementation doesn't provide O(1) access they will have to use a list first). Algorithms that don't need randomness should not be forced to pay for the (considerable!) cost of calling the random number generator, and must accept that the element selected may be predictable.
this is kinda ironic: http://en.wikipedia.org/wiki/Axiom_of_choice
Also irrelevant. That Axiom is only interesting for infinite sets, which Python does not support (at least not using the set builtin -- you can of course write your own symbolic algebra package in Python that can be used to represent certain infinite sets, though you still won't be able to iterate over all of their elements :-).
- If I store objects in a set and modify their attributes I have no O(1)
way of getting the objects back if I stumble upon an equivalent object. In cases like that I'd have to either iterate over the set or use a dict with key == value. I have a feeling the "get" or "peek" api could cater to this need. A use case for this could be an implementation of a cookie jar with a set of cookies where equivalence is defined by the name and domain.
Sets are what they are. If they don't fit your requirements, don't use them. Don't get fooled by the name -- a dict also isn't a very good data structure to implement an actual Chinese-English dictionary, for example. :-)