循环列表列表(嵌套for循环)不能按我的意愿工作

时间:2014-05-14 18:58:07

标签: python for-loop nested-loops

我想要做的是循环遍历 board 中的元素,查找" P",然后检查是否有5" P"& #39;连续(向下,可以这么说)。请参阅代码中的注释以获得进一步说仍然,inRow给我输出15。

提示:五个" P"不应该是静止的,而是由玩家放置但是对于这个例子,我只是放置了静止的。

board = [['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E']]
# has 10 rows, with 10 elements in each

inRow=0

for y in range(10): # Loops over each row (y-index)
    x=0 # x-index resets each new y-index loop (start on the first element (0) of each row)
    for pos in board[y]: # pos loops over all elements in current row 
        if pos is "P": # checks if pos is "P"
            for i in range(5): # loops over 0, 1, 2, 3, 4
                if board[y+i][x] is "P": # when i=0, board[y+i][x] is ought to be where we find the first "P", then check if the following rows (we add +1 to y for each loop) is also "P"
                    inRow += 1 # Counter to see if we got 5 in a row
            break 
        x+=1

print(inRow)

3 个答案:

答案 0 :(得分:1)

即使连续没有inRow“P”,也会添加到5。想一想:

第一次在第二行中点击“P”时,您倒计时得到5。下次在外for循环中点击“P”时,您倒计时并获得4。现在你已经计算了9“P”了。继续这个,你会得到5 + 4 + 3 + 2 + 1 = 15“P”。

解决方案是使用中间计数器,如果该计数器为inRow,则仅将该中间计数添加到5

要正确计算,您可以在for pos in board[y]:

之后立即声明一个计数器
counter = 0

然后,您使用inRow += 1而不是counter += 1

最后,在你的休息声明之前,做一个检查:

if counter == 5:
    inRow += counter

答案 1 :(得分:0)

问题在于,当你休息时,你不会结束两个循环 - 只有第二个循环。

因此,当您的代码找到第一个P时,它会递增inRow,直到它等于5,然后中断。然后,您的代码将移至第二行,第二行P,并递增inRow,直到它等于9 - 5 + 4 = 9

虽然您可以重新构建代码以完全避免此问题,但您也可以将代码包装在函数中并简单地返回而不是破坏:

board = [['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'P', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'],
        ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E']]

def find(board):
    inRow=0
    for y in range(10): 
        x = 0 
        for pos in board[y]: 
            if pos == "P": 
                for i in range(5): 
                    if board[y+i][x] == "P": 
                        inRow += 1 
                return inRow 
            x += 1
    return inRow

print(find(board))

答案 2 :(得分:0)

如果没有5' P'你必须设置标志。在行中然后检查标志是否为真然后增加inRow

inRow=0

for y in range(10):
    x=0 
    for pos in board[y]:
        if pos is "P": 
            flag=True

            for i in range(5): 
                if  not board[y+i][x] is "P":
                    flag=False
            if flag:
                inRow+=1
            break 
        x+=1

print(inRow)