【问题标题】:Change value of every n-th index in a list更改列表中每个第 n 个索引的值
【发布时间】:2020-09-13 11:13:57
【问题描述】:

我想编写一些代码来解决这个“谜”。

有 24 名囚犯,每个人都有自己的牢房。守卫想给一些囚犯一些空闲时间。由于所有牢房的门都关着,他走到每一扇门前,一一打开。第二次,他对每个第二扇门都这样做。第三次,每第三个门。他重复了 24 次。如果一扇门关闭,它就会打开。如果打开它就会关闭。

我尝试自己编写代码,但无法正常工作。

这是我写的:

All_Doors = [True] * 24 # Closed = True, Open = False
for Door in All_Doors:
    for Guard in range(1,25):
        All_Doors[::Guard] = False if True else True

print(All_Doors)

我得到这个错误:TypeError: can only assign an iterable

【问题讨论】:

    标签: python python-3.x list loops for-loop


    【解决方案1】:

    试试这个:

    All_Doors = [True] * 24 # Closed = True, Open = False
    for Guard in range(1,25):
        for current_door in range(Guard,25,Guard):
            All_Doors[current_door-1] = not All_Doors[current_door-1]
    print(All_Doors)
    

    我的输出:

    [False, True, True, False, True, True, True, True, False, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True]
    

    答案是有道理的,因为所有与其他数字平方的数字都是封闭的 - (1,4,9,16) 索引。因为它们有奇数个乘数。

    【讨论】:

    • 我很确定这是正确的方法。你有什么想法可以在不使用 not 的情况下解决这个问题吗?如果没有也没关系。非常感谢
    • 我不知道为什么不使用 not。您可以使用您的代码版本,但它会使其可读性和清晰性大大降低。我猜这不是正确的方法。
    【解决方案2】:

    那是因为您试图将布尔值分配给列表而不对其进行迭代。您要做的就是简单地否定列表All_Doors[::Guard] 是什么。这可以简单地通过使用not

    All_Doors = [True] * 24 # Closed = True, Open = False
    for Door in All_Doors:
        for Guard in range(1,25):
            All_Doors[::Guard] = [not i for i in All_Doors[::Guard]]
    
    print(All_Doors)
    
    [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
    

    【讨论】:

      【解决方案3】:

      你的代码必须是这样的

      All_Doors = [True] * 25 # Closed = True, Open = False
      for Door in All_Doors:
         for Guard in range(25):
            All_Doors[Guard] = not All_Doors[Guard]
      
      print(All_Doors)
      

      尝试使用 not 代替 (False if True else True),因为您想导航门值 no 为其分配新值 if true then false else true

      【讨论】:

        【解决方案4】:

        一种可能的解决方案如下所示:

        All_Doors = [False] * 24 # Closed = False, Open = True
        for r in range(1,25):
            All_Doors = [True if i%r == 0 else False for i in range(1, 1+len(All_Doors))]
            print(f"Round {r}, opening only every {r}-th door", All_Doors[0:10])
        

        据我了解,您需要先关闭所有门 (False),然后在每一轮中只打开第 n 个门。使用模运算符 (%) 很方便,因为它基本上与按每个第 n 个元素切片相同。上面应该给你一些这样的结果(注意,为了便于阅读,在每“轮”守卫打开门之后,我只打印列表中的前 10 个值):

        Round 1, opening only every 1-th door [True, True, True, True, True, True, True, True, True, True]
        Round 2, opening only every 2-th door [False, True, False, True, False, True, False, True, False, True]
        Round 3, opening only every 3-th door [False, False, True, False, False, True, False, False, True, False]
        Round 4, opening only every 4-th door [False, False, False, True, False, False, False, True, False, False]
        Round 5, opening only every 5-th door [False, False, False, False, True, False, False, False, False, True]
        

        注意:如果你想以True开头的所有门,你可以在上面的代码中反转TrueFalse的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-27
          • 1970-01-01
          • 2020-12-08
          • 2023-01-09
          • 2012-01-10
          • 2019-06-15
          • 2019-01-21
          • 2021-03-20
          相关资源
          最近更新 更多