Python |避免从列表中随机选择的先前值
Python | Avoid previous value from random selection from list
基本上我想要我的代码做的是打印出 5 wrong()
函数,而不是连续 2 个相同的文本。当然,我不希望它是靠运气。 :)
虽然不用担心它打印出 5 wrong()
s 的部分,但我只是想确定我是否至少使用此函数两次我 100% 确定以前的值不会和下一个一样。
例如我想避免的:
Wrong!
Wrong!
虽然这样还是可以的:
Wrong!
Incorrect!
Wrong!
我的代码:
import random
def wrong():
wrong_stats=["\n Wrong!","\n Tough Luck!","\n Better Luck Next Time!","\n Not there yet!","\n Incorrect!"]
rand = random.choice(wrong_stats)
rand3 = random.choice(wrong_stats)
norep(rand,rand3,wrong_stats)
def norep(rand,rand3,wrong_stats):
if rand == rand3:
same = True
while same:
rand = random.choice(wrong_stats)
if rand != rand3:
print(rand)
break
elif rand != rand3:
print(rand)
wrong()
wrong()
wrong()
wrong()
wrong()
将之前的值存入一个全局变量,并从列表中随机选择(不包括之前的值):
import random
wrong_stats=["\n Wrong!","\n Tough Luck!","\n Better Luck Next Time!","\n Not there yet!","\n Incorrect!"]
prev = ""
def wrong():
global prev
if prev == "":
prev = random.choice(wrong_stats)
else:
prev = random.choice(wrong_stats[:wrong_stats.index(prev)] + wrong_stats[wrong_stats.index(prev)+1:])
print prev
if __name__ == "__main__":
wrong()
wrong()
wrong()
wrong()
wrong()
全局变量是一种不好的做法。
您应该将最后打印的值传递给 wrong
,然后在除该值之外的所有值之间进行选择。像这样:
import random
def wrong(last):
chosen = random.choice([stat for stat in WRONG_STATS if stat != last])
print(chosen)
return chosen
if "__main__" == __name__:
last = None
for i in xrange(5):
last = wrong(last)
使用random.shuffle:
from random import shuffle
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Better Luck Next Time!', '\n Wrong!', '\n Incorrect!', '\n Tough Luck!', '\n Not there yet!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Incorrect!', '\n Tough Luck!', '\n Better Luck Next Time!', '\n Not there yet!', '\n Wrong!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Incorrect!', '\n Wrong!', '\n Better Luck Next Time!', '\n Not there yet!', '\n Tough Luck!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Wrong!', '\n Incorrect!', '\n Better Luck Next Time!', '\n Tough Luck!', '\n Not there yet!']
这是另一个可能会给你一个想法的例子:
import random
country = ["Spain", "Sweden", "Netherlands", "Germany"]
lastcountry = ''
i = 0
while i <= 5:
country = (random.choice(country))
if (country != lastcountry):
i = i + 1
print (country)
lastcountry = country
它会记住最后选择的选项。
如果它进行了新的选择,它会查看它是否与之前的选择不同。
您需要跟踪它返回的最后一个值;你可以
- 为此使用一个全局模块(在实践中通常很混乱),
- 或将其变成 class (有点冗长)、
- 或者在外部保持跟踪,每次都传入(笨重乏味),
但我认为最好的方法是将 wrong
函数改为 generator:这样您就可以跟踪生成器执行状态中的最后一个返回值,并在下次避免它,而不必担心在任何地方的外部代码中。
def wrong():
wrong_stats = ["Wrong!","Tough Luck!","Better Luck Next Time!","Not there yet!","Incorrect!"]
previous_value = None
while True:
value = random.choice(wrong_stats)
if value != previous_value:
yield value
previous_value = value
和用法:
w = wrong()
for i in range(5):
print(next(w))
# Tough Luck!
# Incorrect!
# Not there yet!
# Tough Luck!
# Better Luck Next Time!
您可以继续使用生成器调用 next
,它将生成无限数量的字符串,而不会重复之前的值。
基本上我想要我的代码做的是打印出 5 wrong()
函数,而不是连续 2 个相同的文本。当然,我不希望它是靠运气。 :)
虽然不用担心它打印出 5 wrong()
s 的部分,但我只是想确定我是否至少使用此函数两次我 100% 确定以前的值不会和下一个一样。
例如我想避免的:
Wrong!
Wrong!
虽然这样还是可以的:
Wrong!
Incorrect!
Wrong!
我的代码:
import random
def wrong():
wrong_stats=["\n Wrong!","\n Tough Luck!","\n Better Luck Next Time!","\n Not there yet!","\n Incorrect!"]
rand = random.choice(wrong_stats)
rand3 = random.choice(wrong_stats)
norep(rand,rand3,wrong_stats)
def norep(rand,rand3,wrong_stats):
if rand == rand3:
same = True
while same:
rand = random.choice(wrong_stats)
if rand != rand3:
print(rand)
break
elif rand != rand3:
print(rand)
wrong()
wrong()
wrong()
wrong()
wrong()
将之前的值存入一个全局变量,并从列表中随机选择(不包括之前的值):
import random
wrong_stats=["\n Wrong!","\n Tough Luck!","\n Better Luck Next Time!","\n Not there yet!","\n Incorrect!"]
prev = ""
def wrong():
global prev
if prev == "":
prev = random.choice(wrong_stats)
else:
prev = random.choice(wrong_stats[:wrong_stats.index(prev)] + wrong_stats[wrong_stats.index(prev)+1:])
print prev
if __name__ == "__main__":
wrong()
wrong()
wrong()
wrong()
wrong()
全局变量是一种不好的做法。
您应该将最后打印的值传递给 wrong
,然后在除该值之外的所有值之间进行选择。像这样:
import random
def wrong(last):
chosen = random.choice([stat for stat in WRONG_STATS if stat != last])
print(chosen)
return chosen
if "__main__" == __name__:
last = None
for i in xrange(5):
last = wrong(last)
使用random.shuffle:
from random import shuffle
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Better Luck Next Time!', '\n Wrong!', '\n Incorrect!', '\n Tough Luck!', '\n Not there yet!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Incorrect!', '\n Tough Luck!', '\n Better Luck Next Time!', '\n Not there yet!', '\n Wrong!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Incorrect!', '\n Wrong!', '\n Better Luck Next Time!', '\n Not there yet!', '\n Tough Luck!']
>>> shuffle(wrong_stats)
>>> wrong_stats
['\n Wrong!', '\n Incorrect!', '\n Better Luck Next Time!', '\n Tough Luck!', '\n Not there yet!']
这是另一个可能会给你一个想法的例子:
import random
country = ["Spain", "Sweden", "Netherlands", "Germany"]
lastcountry = ''
i = 0
while i <= 5:
country = (random.choice(country))
if (country != lastcountry):
i = i + 1
print (country)
lastcountry = country
它会记住最后选择的选项。
如果它进行了新的选择,它会查看它是否与之前的选择不同。
您需要跟踪它返回的最后一个值;你可以
- 为此使用一个全局模块(在实践中通常很混乱),
- 或将其变成 class (有点冗长)、
- 或者在外部保持跟踪,每次都传入(笨重乏味),
但我认为最好的方法是将 wrong
函数改为 generator:这样您就可以跟踪生成器执行状态中的最后一个返回值,并在下次避免它,而不必担心在任何地方的外部代码中。
def wrong():
wrong_stats = ["Wrong!","Tough Luck!","Better Luck Next Time!","Not there yet!","Incorrect!"]
previous_value = None
while True:
value = random.choice(wrong_stats)
if value != previous_value:
yield value
previous_value = value
和用法:
w = wrong()
for i in range(5):
print(next(w))
# Tough Luck!
# Incorrect!
# Not there yet!
# Tough Luck!
# Better Luck Next Time!
您可以继续使用生成器调用 next
,它将生成无限数量的字符串,而不会重复之前的值。