在Python 3中计算列表中四个连续数字是否相等

3

用户掷5个骰子。如果其中4个成一排,则授予用户30分;否则不授予分数。当我有一个包含5个数字的列表来表示骰子时,如何搜索该列表以查看是否包含四个连续数字?我的代码如下:

diceList = sorted(diceList)
elif letterChoice == "J" and diceCombinations[9] == False:
    diceList = list(set(diceList))
    print (diceList)
    if diceList in [[1,2,3,4], [2,3,4,5], [3,4,5,6]]:
        score = score + 30
        diceCombinations[9] = True

这个方法大部分情况下都可以正常工作,但是如果我掷出了1、2、3、4或6,就会有问题。感谢您的帮助。

1个回答

4

使用any反转您的in测试,并将diceList保留为set

diceList = set(diceList)
if any(match <= diceList for match in (
        {1, 2, 3, 4},
        {2, 3, 4, 5},
        {3, 4, 5, 6},
    )):
    # do something

解释:
由于set只保留唯一元素的一个副本,因此{1, 1, 1, 3, 2, 6}最终变成{1, 3, 6, 2}(顺序不保留),因此通过将diceList转换为set,我们失去了任何重复项。
然后,我们遍历“四个连续”的可能解决方案,例如{1, 2, 3, 4},以查看diceList是否匹配。这部分通过使用<=符号来工作,对于集合来说,它意味着LHS(左侧)的元素比RHS(右侧)少(<),或者与RHS具有相同的元素(=),并且没有RHS中不存在的元素。所以:
{1, 2}是< {1, 2, 3}。
{1, 2, 3}等于{1, 2, 3}
{1, 2, 5}既不是<也不是= {1, 2, 3}
注意:这被称为偏序,因为一个集合可以不等于,不小于,也不大于另一个集合。

1
我相信你可以通过将 row & diceList == row 更改为 row <= diceList 来节省一些工作,这样做可以进行适当的真子集检查(带有短路效应),而无需创建临时 set 并执行比较。 - ShadowRanger
1
@ShadowRanger:是的,我测试过了,它可以工作;我已经更新了我的代码。谢谢! - Ethan Furman
保持diceList作为一个集合 - 名称上有点令人困惑。 - aghast
@AustinHastings:我对问题中变量的名称以及Python中数据类型的名称都没有任何输入。 ;) - Ethan Furman
这可能不符合原帖的要求。如果原帖想要连续顺序的4个数字,或者是连续但可以任意排列的4个数字。我认为应该是前者。例如(diceList = [2, 4, 1, 3, 6] 应该失败)。尽管使用 diceList = sorted(diceList)diceList = list(set(diceList)) 可以消除顺序。 - Steven Summers
@StevenSummers:diceList代表掷五个骰子;在我玩过的所有骰子游戏中,骰子不必按正确顺序排列,只需出现即可。此外,OP将diceList排序作为他的第一步。 - Ethan Furman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接