【问题标题】:checking for string in nested list检查嵌套列表中的字符串
【发布时间】:2017-04-15 10:32:12
【问题描述】:

我正在尝试在我的井字游戏程序中编写一个函数,用于检查网格上一行中的所有三个空格是否已标记为“x”或“o”。 lst_1 是所有可能的行组合的列表:

def conc():
    global lst
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]],    [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]],    [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],     [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],    [lst[2],lst[4],lst[6]]]
    triplet = [s for s in lst_1]
     if all('o' == item for item in triplet):
        print('Player 2 wins!')
        reply()
    elif all('x' == item for item in triplet):
        print('Player 1 wins!')
        reply()
    else:
        pass 

我认为当有人设法连续获得 3 个时这会停止游戏,但它继续进行。有什么想法吗?

【问题讨论】:

  • 我认为您在 lst_1 中有一些额外的数据,这会搞砸。
  • 您的all() 电话也缺少一些关键部分。
  • 您的缩进已关闭,这在 Python 中至关重要。您的变量triplet 似乎与lst_1 相同。你没有告诉我们reply() 是什么或做什么。请参阅How to create a Minimal, Complete, and Verifiable example

标签: python list function nested


【解决方案1】:

为了简单地回答您的问题,您没有遍历lst_1。我想你认为你是根据你用于triplet 的语句,但实际上只是将lst_1 复制到triplet

我假设您实际上是在尝试用lst_1 制作一个生成器并将其分配给triplet,但是您不小心使用了列表推导,并且不完全理解生成器的工作原理。阅读更多关于生成器的信息here

虽然生成器在某些情况下无疑是有用的,但我认为它们实际上不会在这里简化您的代码。无论如何,您将需要一个循环,并且您必须检查 StopIteration 异常以了解生成器何时结束。

所以,我的建议是使用for 循环。

def conc():
    global lst
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]],    [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]],    [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],     [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],    [lst[2],lst[4],lst[6]]]
    for triplet in lst_1:
        if all('o' == item for item in triplet):
            print('Player 2 wins!')
            reply()
            break
        elif all('x' == item for item in triplet):
            print('Player 1 wins!')
            reply()
            break

其他一些细节: 将else: pass 添加到if-elif-else 循环的末尾是完全无关的。它不必在那里。

另外,尽量避免使用全局变量。阅读一些关于 Python 中作用域的信息。它可能适用于简单的程序,但如果你在处理任何远程复杂的事情时依赖它们,它会伤害你。

【讨论】:

  • 谢谢@Dodosaur。为什么全局函数不受欢迎?
  • This answer 解释得比我更有说服力。
  • 对不起,我按回车并提交。基本要点是它使代码难以理解,因为如果一个函数使用全局变量,那么函数范围之外的东西就会影响它。
猜你喜欢
  • 2019-10-07
  • 2016-02-08
  • 1970-01-01
  • 2020-05-11
  • 2019-08-25
  • 2019-01-09
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多