我正在尝试编写一个程序,该程序计算列表中某项大于任一侧相邻邻居的次数:
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_num1
和ind_num2
随着循环的进行显示正确的值。但是,index1
和index2
保持不变,而不是按照ind_num1
和`ind_num2'的值递增。他们为什么不改变?
答案 0 :(得分:1)
ind_num1
和ind_num2
似乎对index1
和index2
无效的原因是因为您要在循环中递增前两个变量,但是ve在循环外分配了index1
和index2
的值。因此,index1
和index2
将始终分别保持为0
和2
。如果要index1
和index2
准确反映ind_num1
和ind_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
的目的是使您可以通过e
和inp[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))
将迭代次数(即enumerate
,0
,... 1
)量化为6
。此值(即e
)用于确定相邻的列表项(即e
),该列表项使您可以消除所有那些不必要的变量。 FWIW,n[e] and n[e+2]
本质上等于i
。