Feature Requests item #1551113, was opened at 2006-09-02 13:27 Message generated for change (Comment added) made by rhettinger You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=355470&aid=1551113&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. >Category: Python Library Group: None >Status: Closed >Resolution: Rejected Priority: 5 Submitted By: Alan (aisaac0) Assigned to: Raymond Hettinger (rhettinger) Summary: random.choice(setinstance) fails Initial Comment: It seems perverse that random.choice cannot pick from a set. (Maybe it is also perverse that it cannot pick a key from a dict.) The current definition is def choice(self, seq): """Choose a random element from a non-empty sequence.""" return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty How about something along the lines of: def choice(self, seq): """Choose a random element from a non-empty sequence.""" idx = int(self.random() * len(seq)) try: result = seq[idx] # raises IndexError if seq is empty except TypeError: result = list(seq)[idx] return result ---------------------------------------------------------------------- >Comment By: Raymond Hettinger (rhettinger) Date: 2006-09-02 17:44 Message: Logged In: YES user_id=80475 Sorry, even as a feature request, this is doomed. ---------------------------------------------------------------------- Comment By: Tim Peters (tim_one) Date: 2006-09-02 14:37 Message: Logged In: YES user_id=31435 This is certainly a feature request rather than a bug (the code is working as documented (a set is not a sequence) and as designed). Change it to a feature request, and it will probably just sit there for years ;-) The unwritten promise is that choice(s) on a sequence of length N will take O(1) time and O(1) space. There is no known way to do this given the current implementations of dicts and sets better than O(N) time and O(1) space (and even that poor behavior is tricky to achieve -- the way suggested by the OP requires O(N) time and O(N) space). Rather than give users surprisingly atrocious performance for one type of argument, leaving it out of choice() emphasizes reality: if you want efficient random selection from a set, you /need/ to use a fancier data structure than a Python set. OTOH, if you don't care about efficiency, it's hardly a burden to write random.choice(list(myset)) instead. Then at least the atrociousness of your algorithm design is obvious to readers of the code <0.5 wink>. ---------------------------------------------------------------------- Comment By: Georg Brandl (gbrandl) Date: 2006-09-02 13:33 Message: Logged In: YES user_id=849994 To Raymond: Wasn't there a discussion about random.choice() some time ago? ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=355470&aid=1551113&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com