【问题标题】:Checking if a value is in a list of lists always returns False [duplicate]检查一个值是否在列表列表中总是返回 False [重复]
【发布时间】:2020-10-17 01:25:41
【问题描述】:

目前正在研究一个小型数独求解器,我使用布尔值

if 0 in BOARD_EASY:
  do the thing

将 board 作为此值用于测试目的:

BOARD_EASY =[
    [7,2,5,8,1,3,6,4,9],
    [4,8,6,9,2,7,1,5,3],
    [3,1,9,6,5,4,8,7,2],
    [5,6,4,2,7,1,3,9,8],
    [8,9,1,5,3,9,4,2,7],
    [2,7,3,4,8,9,5,6,1],
    [6,3,8,7,9,5,2,1,4],
    [9,4,2,1,6,8,7,3,5],
    [0,0,7,3,4,2,9,8,6]
]

由于某些原因,布尔值返回 false,虽然板上仍有 0,但我错过了什么吗? 它似乎不像 board_easy 的第一行那样检查(例如,我尝试删除最后一个数字)

编辑:允许我完成我的项目,谢谢大家! (https://github.com/Lem0nRavioli/sudoku_solver)

【问题讨论】:

  • 您的列表只直接包含其他列表

标签: python operator-keyword


【解决方案1】:

我相信in 运算符不检查嵌套值,只检查第一级。

所以它正在查看您的列表,并且只查看其他列表。见下文。

BOARD_EASY =[
    [7,2,5,8,1,3,6,4,9], #-> list
    [4,8,6,9,2,7,1,5,3], #-> list
    [3,1,9,6,5,4,8,7,2], #-> list
    [5,6,4,2,7,1,3,9,8], #-> list
    [8,9,1,5,3,9,4,2,7], #-> list
    [2,7,3,4,8,9,5,6,1], #-> list
    [6,3,8,7,9,5,2,1,4], #-> list
    [9,4,2,1,6,8,7,3,5], #-> list
    [0,0,7,3,4,2,9,8,6]  #-> list
]

所以正确的解决方案是循环遍历列表列表BOARD_EASY,然后循环遍历每个列表的内容:

for nested_list in BOARD_EASY:
  for items in nested_list:
    if 0 in items:
      print("Found!")

【讨论】:

    【解决方案2】:

    我知道您已经对此做出了回应,我想分享一个使用any 最小化迭代的选项

    if any(0 in elem for elem in BOARD_EASY):
        print ('0 is found in BOARD_EASY')
    else:
        print ('0 is NOT found in BOARD_EASY')
    

    any 函数的重要性在于它在找到值后立即将执行短路。所以它不会遍历整个列表。

    查看您的代码,您的 if 语句 if 0 in BOARD_EASY: 将导致 if (0 == BOARD_EASY[0]) or (0 == BOARD_EASY[1]) .....。该列表有很多元素,因此比较不正确。您需要查找列表中的每个项目并比较内部列表中的元素。使用上面的代码(使用任何函数),它就可以了。

    【讨论】:

      【解决方案3】:

      根据in 运算符的文档:

      运算符innot in 测试成员资格。如果 x 是 s 的成员,x in s 计算为 True,否则计算为 False

      0 不是BOARD_EASY 的成员。列表[0,0,7,3,4,2,9,8,6] 是。

      所以你可以这样做:

      any(0 in elem for elem in BOARD_EASY)
      

      【讨论】:

      • 如果省略方括号,表达式变成了一个生成器,如果列表很大的话会更好。
      【解决方案4】:

      你可以使用 numpy.flatten:

      BOARD_EASY = np.array(BOARD_EASY).flatten()
      print("do the thing") if 0 in BOARD_EASY else False
      
      do the thing
      

      【讨论】:

      • 如果使用 numpy,可以使用 np.isin(0, BOARD_EASY).item() 避免扁平化。输出True
      • @jakub 很高兴知道——谢谢!
      【解决方案5】:

      我看到所有答案都是遍历所有元素,或者复制所有数据,或者实现 3 行代码来完成,所以这里有一个快速简单的解决方案:

      if 0 in itertools.chain(*BOARD_EASY):
        do the thing
      

      chain 的作用是遍历BOARD_EASY 中的每一项,就好像它只遍历一个列表一样。

      【讨论】:

        【解决方案6】:

        BOARD_EASY 是一个列表列表。 BOARD_EASY 不包含 0...它包含 9 个列表。

        这里,看:

        BOARD_EASY = [
          [7, 2, 5, 8, 1, 3, 6, 4, 9],
          [4, 8, 6, 9, 2, 7, 1, 5, 3],
          [3, 1, 9, 6, 5, 4, 8, 7, 2],
          [5, 6, 4, 2, 7, 1, 3, 9, 8],
          [8, 9, 1, 5, 3, 9, 4, 2, 7],
          [2, 7, 3, 4, 8, 9, 5, 6, 1],
          [6, 3, 8, 7, 9, 5, 2, 1, 4],
          [9, 4, 2, 1, 6, 8, 7, 3, 5],
          [0, 0, 7, 3, 4, 2, 9, 8, 6]
        ]
        
        for i, x in enumerate(BOARD_EASY):
            print(i+1, x)
        

        结果:

        1 [7, 2, 5, 8, 1, 3, 6, 4, 9]
        2 [4, 8, 6, 9, 2, 7, 1, 5, 3]
        3 [3, 1, 9, 6, 5, 4, 8, 7, 2]
        4 [5, 6, 4, 2, 7, 1, 3, 9, 8]
        5 [8, 9, 1, 5, 3, 9, 4, 2, 7]
        6 [2, 7, 3, 4, 8, 9, 5, 6, 1]
        7 [6, 3, 8, 7, 9, 5, 2, 1, 4]
        8 [9, 4, 2, 1, 6, 8, 7, 3, 5]
        9 [0, 0, 7, 3, 4, 2, 9, 8, 6]
        

        您要查找的等效代码按顺序检查每个列表:

        for i, l in enumerate(BOARD_EASY):
            if 0 in l:
                print("There's a zero in row " + str(i + 1))
        

        结果:

        There's a zero in row 9
        

        【讨论】:

          【解决方案7】:

          Board_easy 是一个列表列表,因此第一个元素是 [7,2,5...] 而不是 7。您需要一个嵌套的 for 循环来迭代每个维度

          【讨论】:

            【解决方案8】:

            如果您只检查其中一个索引中元素的成员资格,则不需要嵌套 for 循环:

            for count, i in enumerate(BOARD_EASY):
                if 0 in i:
                    print("Found it in index", count)
            

            【讨论】:

              【解决方案9】:

              感谢所有答案,让我了解“in”运算符的情况。 最后使用了与 David Erickson 相关的一行:

              # start of the script
              BOARD_EASY = np.array(BOARD_EASY)
              #
              #
              if 0 in np.concatenate(BOARD_EASY):
                do the thing
              

              【讨论】:

              • Numpy 是一个很棒的工具,它有助于加快对大量数据的某些操作。但是如果使用它的唯一原因是在嵌套列表中搜索某些东西,比如这里,那么它的使用是不合理的。
              猜你喜欢
              • 2011-09-14
              • 2019-05-26
              • 2020-02-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-24
              相关资源
              最近更新 更多