On Fri, May 14, 2010 at 11:23 PM, Carl Banks <pavlovevide...@gmail.com> wrote: > On May 14, 9:39 am, Terry Reedy <tjre...@udel.edu> wrote: >> On 5/14/2010 11:24 AM, gerardob wrote: >> > Hello, let S be a python set which is not empty >> > (http://docs.python.org/library/sets.html) >> >> > i would like to obtain one element (anyone, it doesn't matter which one) >> > and >> > assign it to a variable. >> >> > How can i do this? >> >> Depends on whether or not you want the element removed from the set >> >> #3.1 >> >>> s=set(range(10)) >> >>> s >> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} >> >>> x=next(iter(s)) >> >>> x >> 0 >> >>> s >> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} # x not removed >> >>> x = s.pop() >> >>> x >> 0 >> >>> s >> {1, 2, 3, 4, 5, 6, 7, 8, 9} # x has been removed >> >> The choice of 0 is an implementation artifact. It could have been any >> member. > > Which brings up an interesting question: how do you get a random > element from a set? > > random.choice(list(s)) > > is the most straightforward way and will work a lot of the time, but > how would you avoid creating the list? I can't think of a way off > hand.
def random_set_elem(s): iterator = iter(s) n = random.randint(0, len(s)-1) for i in xrange(n): next(iterator) return next(iterator) Avoids creating the list, but it's still O(M). If you're gonna pick multiple times from the same set, you're better off just converting it to a list. Cheers, Chris -- http://blog.rebertia.com -- http://mail.python.org/mailman/listinfo/python-list