[Edu-sig] source code from SA:10648
Tim Peters
tim.peters at gmail.com
Fri Jul 16 04:37:28 CEST 2010
[kirby urner]
...
> Here's the remedied function:
> def askq(quiz = quiz1):
> score = 0
> possible = len(quiz)
> thequiz = quiz[:] # from hence forth, use thequiz, leave quiz alone
>
> while len(quiz) > 0:
> pickone = randint(0, len(quiz)-1)
> ...
> thequiz.pop(pickone)
You're working too hard ;-)
> Now of course it's problematic to be popping off a list just because
> you wanna not hit the same question twice, and are picking
> questions randomly. Sure, this is one way to prevent duplicates.
> Even the while loop is pegged to the list length. Didn't have to
> be this way.
> Just as good if not way better, is to shuffle the indexes ahead
> of time e.g. indexes = range(len(thelist)); indexes.shuffle().
> That'll give you a random sequence on a "primary key" with no
> need to mess with popping data off a list copy.
Still working too hard ;-)
Why not shuffle the quiz guts directly?
def askq(quiz = quiz1):
thequiz = quiz[:] # from hence forth, use thequiz, leave quiz alone
shuffle(thequiz)
for q, a in thequiz: # marches over the questions in a random order
# `q` is the question, `a` is the answer
In fact, if you don't mind permuting the quiz each time, there's no
need to make a copy of the quiz then either (because nothing is ever
removed from it):
def askq(quiz = quiz1):
shuffle(quiz)
for q, a in quiz: # marches over the questions in a random order
# `q` is the question, `a` is the answer
More information about the Edu-sig
mailing list