On Wed, 26 Jul 2017 08:58:03 +0200, ast wrote: > Hello > > random.choice on a set doesn't work because sets are not indexable > > so I found nothing better than taking an element and puting it back > > a = {5, 7, 8, 3, 0, 8, 1, 15, 16, 34, 765443} > elt = a.pop() > a.add(elt)
That's not *random*, it is arbitrary but predictable. If you try it twice in a row, you will probably get the same element each time. (Depends on the elements, but very likely.) >>> a = {5, 7, 8, 3, 0, 8, 1, 15, 16, 34, 765443} >>> elt = a.pop() >>> a.add(elt) >>> elt 0 >>> a.pop() # likely to be zero again 0 > any better idea, in a single instruction ? If you know the set is not empty, you can do: element = next(iter(a)) but that has the same problem as above: the choice won't be random, and each time you do it you'll get the same element: >>> next(iter(a)) # after popping zero and not adding it again 1 >>> next(iter(a)) 1 If you need a random element, best way is: >>> random.choice(list(a)) 8 >>> random.choice(list(a)) 15 >>> random.choice(list(a)) 16 -- “You are deluded if you think software engineers who can't write operating systems or applications without security holes, can write virtualization layers without security holes.” —Theo de Raadt -- https://mail.python.org/mailman/listinfo/python-list