我可以在python的for循环内更改for循环外的变量吗?

时间:2019-10-07 20:44:49

标签: python loops for-loop variables variable-assignment

我正在尝试编写一个程序,该程序计算列表中某项大于任一侧相邻邻居的次数:

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
    count = 0
    ind_num1 = 0
    ind_num2 = 2
    index1 = n[ind_num1]
    index2 = n[ind_num2]
    for i in n[1:-1]:
        if i > index1 and i > index2:
            count += 1
        ind_num1 += 1
        ind_num2 += 1
    return count

print(check(inp))

我的解决方案是检查for循环(i)中的值是否大于它上面和下面的索引,同时每次通过循环将一个值添加到每个相邻的索引中。 ind_num1ind_num2随着循环的进行显示正确的值。但是,index1index2保持不变,而不是按照ind_num1和`ind_num2'的值递增。他们为什么不改变?

1 个答案:

答案 0 :(得分:1)

ind_num1ind_num2似乎对index1index2无效的原因是因为您要在循环中递增前两个变量,但是ve在循环外分配了index1index2的值。因此,index1index2将始终分别保持为02。如果要index1index2准确反映ind_num1ind_num2的值,则需要更新index1和{{1} },并在循环中进行每次迭代。

index2

如果您还想将列表中的第一项与最后一项和第二项进行比较,并且将列表中的最后一项与倒数第二项和第一项进行比较,则就像... < / p>

inp = [1, 2, 3, 2, 8, 7, 6, 9, 5]

def check(n):
    count = 0
    ind_num1 = 0
    ind_num2 = 2
    for i in n[1:-1]:
        index1 = n[ind_num1]
        index2 = n[ind_num2]
        if i > index1 and i > index2:
            count += 1
        ind_num1 += 1
        ind_num2 += 1
    return count

print(check(inp))

您可以通过列举列表来跟踪当前索引,其中inp = [1, 2, 3, 2, 8, 7, 6, 9, 5] def check(n): count = 0 for e,i in enumerate(inp): follIndex = e+1 if e+1 < len(n) else 0 # Changes index of following item to 0 if comparing last item in the list. if i > inp[e-1] and i > inp[follIndex]: count += 1 return count print(check(inp)) # Returns and prints '3' because three values (3, 8, 9) # are bigger than both of the adjacent values in the list. 的值是一个整数,始终代表当前项目的索引。

跟踪当前索引或e的目的是使您可以通过einp[e-1]轻松访问相邻的列表项。

这使您摆脱了许多不必要的变量。


由于您不想比较第一项或最后一项,因此您可以这样做:

inp[e+1]

您使用inp = [1, 2, 3, 2, 8, 7, 6, 9, 5] def check(n): count = 0 for e,i in enumerate(n[1:-1]): if i > n[e] and i > n[e+2]: count += 1 return count print(check(inp)) 将迭代次数(即enumerate0,... 1)量化为6。此值(即e)用于确定相邻的列表项(即e),该列表项使您可以消除所有那些不必要的变量。 FWIW,n[e] and n[e+2]本质上等于i