import random
def randomize_list(lst):
if lst == []:
return []
# this case is only here because randrange will not
# take (x,y) where x == y
if len(lst) == 1:
# really it would be enough to just pop the last
# element and not have to cons with an []
return [ lst.pop() ]
else:
return [ lst.pop(random.randrange(0, len(lst))) ] + randomize_list(lst)
YES!
>>> random_list.randomize_list([1,2,3,4,5,6,7,8,9,10])
[8, 3, 2, 4, 9, 7, 5, 1, 6, 10]
>>> random_list.randomize_list([1,2,3,4,5,6,7,8,9,10])
[8, 5, 10, 2, 4, 1, 9, 6, 3, 7]
>>> random_list.randomize_list([1,2,3,4,5,6,7,8,9,10])
[3, 5, 2, 8, 7, 10, 6, 9, 4, 1]
lst.pop creates a sideeffect so what we really want to do is perhaps something like
index = random.randrange(0, len(lst))
return [ lst[index] ] + randomize_list( lst[:index1] + lst[index+1:]
And then someone came along and said just use random.shuffle
>>> a = range(1,20)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> random.shuffle(a)
>>> a
[11, 9, 7, 19, 13, 18, 16, 3, 6, 2, 14, 8, 5, 4, 10, 17, 1, 12, 15]
>>>
While this is fine, I am not a particular fan because it changes a list in place, one of the things I find lacking in python.
No comments:
Post a Comment