In your inner loop, you can consider using the following try
statement (to replace the if x in subs
):
from random import randrange
try:
idx = subs.index(x)
while True:
a = randrange(0, len(subs))
if a != idx:
break
print(subs[a])
except ValueError:
pass
The try
suite tries to find the index in subs
with corresponding element equal to the word x
.
x
is not found, a ValueError
is raised and we quietly ignore it.x
is found, idx
is assigned the corresponding index. Then, we assign a random integer in [0, len(subs) - 1]
(i.e. the set of valid indices for subs
) to a
until a
is not equal to idx
. Once a
is not equal to idx
, we break out of the loop and print subs[a]
.Drawing inspiration from @Mad Physicist, it would be better if the try
suite were replaced with
a = randrange(0, len(subs) - 1)
a += a >= subs.index(x)
which assigns a
to a random integer in [0, len(subs) - 1)
and then increments a
by 1 if a >= idx
is true; otherwise (i.e. if a < idx
is true), a
is unchanged. If this change is made, the try
statement becomes
try:
a = randrange(0, len(subs) - 1)
a += a >= subs.index(x)
print(subs[a])
except ValueError:
pass
A slight optimization would be to simply catch all exceptions with except:
(replacing except ValueError:
). See, for example, this answer. The gist of it is that if an except clause has an expression (here, ValueError
), it needs to be evaluated and tested against the raised exception from the try
suite. An expression-less except clause (as in except:
) does not have to do this additional step. I would not recommend making catching all exceptions a habit, however -- it is context-specific.
Example Session
Suppose that
words = ["green", "eggs", "and", "ham", "hewwo", "woahwa"]
bigLsts = [['herro', 'hewwo', 'holas'], ['woah', 'woahwa', 'whatda']]
A session might yield output
herro
whatda
* Be the first to Make Comment