是我的while循环不正确地比较两个列表?



我的程序从列表中随机选择四个项目,对它们进行排序,并将它们与同样排序的名为'my_ticket'的列表进行比较。

我的程序应该重复选择四个项目,直到它选择的四个项目匹配列表'my_ticket'。

当前,循环运行并且从未找到匹配,如果有人能指出我程序中的错误,我将不胜感激。

我的程序:

from random import choice
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c', 'd', 'e']
# check if picks and my_ticket match
def check_if_equal(list_one, list_two):
return sorted(str(list_one)) == sorted(str(list_two))
my_ticket = [1, 3, 'a', 'c']
picks = []
counter = 0
while check_if_equal(my_ticket, picks) == False:
for pick in range(4):
pick = choice(list)
picks.append(pick)
counter += 1
print(picks)

必须在每次循环迭代时清除picks:

while not check_if_equal(my_ticket, picks):
picks = random.choice(lst, 4)  # do not ues the varaible name `list`

同样,不要将列表转换为字符串,只比较排序列表(最好使用key函数来处理不同类型的对象):

def check_if_equal(list_one, list_two):
return sorted(list_one, key=str) == sorted(list_two, key=str)  

请注意排序是对数线性的,因此(至少在算法上)顺序不敏感的比较最好使用collections.Counter(其计数集合具有线性复杂性):

from collections import Counter
def check_if_equal(list_one, list_two):
return Counter(list_one) == Counter(list_two)

需要在每次while循环迭代之前重置列表:

from random import choice
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c', 'd', 'e']
# check if picks and my_ticket match
def check_if_equal(list_one, list_two):
return sorted(str(list_one)) == sorted(str(list_two))
my_ticket = [1, 3, 'a', 'c']
picks = []
counter = 0
while check_if_equal(my_ticket, picks) == False:
picks = []
for pick in range(4):
pick = choice(list)
picks.append(pick)
counter += 1
print(picks)

同样,如果你想要精确匹配相同顺序的元素,试着改变你的check_if_equal函数:

def check_if_equal(list_one, list_two):
if len(list_two) == 0:
return False
for i in range(len(list_one)):
if list_one[i] != list_two[i]:
return False
return True

匹配的概率非常低,因此您可以检查以确保您的代码与这个缩短的测试用例一起工作:

list = [1, 2, 3, 'a', 'b', 'c', 'd']

我计算了原始测试每次尝试获得它的概率,它是(1/15)^4 = 1/50625,我的代码在第6万次尝试时获得了它。

相关内容

  • 没有找到相关文章

最新更新