代码之家  ›  专栏  ›  技术社区  ›  Lem0n

Python“in”运算符,意外值

  •  0
  • Lem0n  · 技术社区  · 4 年前

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

    if 0 in BOARD_EASY:
      do the thing
    

    将板作为该值用于测试:

    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]
    ]
    

    它看起来不像第一行板那样容易检查(例如,我试着去掉最后一个数字)

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

    9 回复  |  直到 4 年前
        1
  •  4
  •   Jakub Zurakowski    4 年前

    我相信 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
  •  2
  •   xgord    4 年前

    根据文件 in 操作员:

    操作员 在里面 not in 会员资格测试。 x in s 计算结果为 True 如果x是s的成员,并且 False 否则。

    0 不是的成员 BOARD_EASY . 名单 [0,0,7,3,4,2,9,8,6] 是。

    any([0 in elem for elem in BOARD_EASY])
    
        3
  •  2
  •   Joe Ferndz    4 年前

    我知道你已经对此有了回应,我想分享一个选项,用以最小化迭代 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')
    

    任何 它的功能是,一旦找到值,它就会使执行短路。所以它不会遍历整个列表。

    if 0 in BOARD_EASY: 会导致 if (0 == BOARD_EASY[0]) or (0 == BOARD_EASY[1]) ..... . 列表中有许多元素,因此比较不正确。您需要查找列表中的每个项并比较内部列表中的元素。对于上面的代码(任何函数),它都能做到。

        4
  •  1
  •   David Erickson    4 年前

    你可以利用压扁:

    BOARD_EASY = np.array(BOARD_EASY).flatten()
    print("do the thing") if 0 in BOARD_EASY else False
    
    do the thing
    
        5
  •  1
  •   zvone    4 年前

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

    什么 chain BOARD_EASY ,就好像它只是在遍历一个列表。

        6
  •  1
  •   CryptoFool Sachithra Dilshan    4 年前

    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
  •  0
  •   Bugbeeb    4 年前

        8
  •  0
  •   adlopez15    4 年前

    如果只检查某个索引中元素的成员身份,则不需要嵌套for循环:

    for count, i in enumerate(BOARD_EASY):
        if 0 in i:
            print("Found it in index", count)
    
        9
  •  0
  •   Lem0n    4 年前

    最后用了一句和大卫·埃里克森有关的话:

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