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

Reply via email to