In order to shuffle the sequence uniformly, random.shuffle()
needs to know how long the input is. A generator cannot provide this; you have to materialize it into a list:
lst = list(yielding(x))
random.shuffle(lst)
for i in lst:
print i
You could, instead, use sorted()
with random.random()
as the key:
for i in sorted(yielding(x), key=lambda k: random.random()):
print(i)
but since this also produces a list, there is little point in going this route.
Demo:
>>> import random
>>> x = [1,2,3,4,5,6,7,8,9]
>>> sorted(iter(x), key=lambda k: random.random())
[9, 7, 3, 2, 5, 4, 6, 1, 8]