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