将数字列表与数字集列表进行比较的python代码

2024-09-21 01:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python做一个简单的井字游戏。我陷入困境的一点是验证是否有人赢了。我正在努力使它尽可能的简短和简单,并且易于调整,这样我就可以将该技术用于其他一些项目想法。我正在分块完成整个程序,现在只需要这部分的帮助。下面是我正在尝试做的一个例子:

我知道我甚至可以为select case的某个版本编写一系列if-else语句,但我正在尝试看看python中是否有一种简单的方法,可以使代码适应动态数据集,从而完成同样的工作

我首先创建一个令牌系统,并将其绑定到我的tic-tac趾板上的位置。当玩家选择占据1-9的位置时,相应的令牌被传递到玩家令牌列表,并从令牌列表中移除该项。这有助于防止单元格被覆盖,并跟踪每个玩家单元格的位置

tokens = [1,2,3,4,5,6,7,8,9]
player_tokens = []
keys = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

在每个回合中,我都需要一个函数来比较列表标记,并查看它是否包含一个匹配的密钥集。如果它这样做,它将返回一个胜利

tokens = [3,5,6,7,8]
player_tokens = [1,2,4,9]
keys = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

谢谢你的建议


Tags: 项目程序版本游戏列表玩家keysselect
3条回答

在这种情况下,我建议使用实际的python集

rows = [{1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
        {1, 4, 7},
        {2, 5, 8},
        {3, 6, 9},
        {1, 5, 9},
        {3, 5, 7}]

def is_three_in_a_row(player_tokens):
    return any(row.issubset(player_tokens) for row in rows)

其中.issubset将执行我们关心的检查:

is_three_in_a_row({1, 2, 3, 4})  # True

is_three_in_a_row({2, 3, 4, 5})  # False

有一个Python标准库itertools,它非常适合这些东西。这里可以使用combinations函数:

threes = list(itertools.combinations(player_tokens,3))

threes成为player_tokens中所有唯一3元素元组的列表,可用于检查“获胜”键:

#note that I changed your example slightly to include a 3-in-a-row
tokens = [3,5,6,7,8]
player_tokens = [1,2,3,9]
keys = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

threes = list(itertools.combinations(player_tokens,3))

print(threes)
print([sorted(x) in keys for x in threes])  #using sorted to convert tuple to list and make sure is in order

输出:

[(1, 2, 3), (1, 2, 9), (1, 3, 9), (2, 3, 9)]
[True, False, False, False]

您可以使用any来查看布尔列表中是否有任何一个是True(也就是说,如果移动创建了一个三位组合,这是一个胜利)

您应该将player_tokens更改为一个集合。将其初始化为set(),并使用add而不是append。 要检查,请使用player_tokens.contains(keys[i])

在控制台中尝试help(set.contains)

要检查所有u可以使用any(player_tokens.contains(keys[i]) for i in len keys)

相关问题 更多 >

    热门问题