Python中同符号邻居的练习-需要帮助



我做了下面的练习。

具有相同符号的邻域给定一个数字序列,找出并输出第一个具有相同符号的相邻元素。如果没有这样的pair,打印NONE。请注意,输出必须与示例中所示的相同。

的例子输入:-1 2 -3 -4 -5 1 2输出:3 4

这是我的代码,但它不工作,当我试图抓住的情况下,当对是不相同的标志,有人可以帮助吗?代码工作得很好,但是当我添加ELSE时,事情就崩溃了。

s = input()
my_list_str = s.split()
my_list = []
for beta in my_list_str:
my_list.append(int(beta))
for i in range(len(my_list)-1):
if my_list[i]>0 and my_list[i+1] >0:
print (my_list[i], end =' ')
print (my_list[i+1])
break
elif my_list[i]<0 and my_list[i+1] <0:     
print (my_list[i], end =' ')
print (my_list[i+1])
break
else:
print ('NONE')

添加一个found标志

s = input()
my_list_str = s.split()
my_list = []

for beta in my_list_str:
my_list.append(int(beta))

found=False
for i in range(len(my_list)-1):
if my_list[i]>0 and my_list[i+1] >0:
print (my_list[i], end =' ')
print (my_list[i+1])
found=True
break
elif my_list[i]<0 and my_list[i+1] <0:     
print (my_list[i], end =' ')
print (my_list[i+1])
found=True
break

if not found:
print ('NONE')

你应该检查一次else部分

我建议跟踪以前和当前数字的符号以及找到的标志。例如:

list = [-1, 2, -3, 4, -5, 1]
prev_sign = -1
found = 0
for i in range(len(list)):
this_sign = list[i] < 0
if this_sign == prev_sign:
print("{} {}".format(list[i - 1], list[i]))
found = 1
break
prev_sign = this_sign
if not found:
print("NONE")

或者更简洁一点,for循环可以像这样:

for i in range(1, len(list)):
if (list[i] < 0) == (list[i - 1] < 0):
print("{} {}".format(list[i - 1], list[i]))
found = 1
break

我在代码中看到的一个错误是将else语句放置在for循环中。在现有代码中,如果前两个元素有不匹配的符号,那么它将立即打印'NONE',因为它到达了else语句,并将继续打印'NONE',直到找到匹配的邻居。我将重写你的for循环如下:

found_pair = False
for i in range(len(my_list)-1):
if my_list[i] * my_list[i+1] > 0: # matching sign
found_pair = (my_list[i], my_list[i+1])
break
if found_pair:
print(found_pair[0], found_pair[1])
else:
print('NONE')

在上面的代码中,结果必须只在for循环结束后打印一次。如果找到一对,则存储它并中断,否则我们在没有分配found_pair的情况下耗尽循环,导致'NONE'只在最后打印一次。让我知道如果这不起作用,或者如果你有任何问题!

大卫

有很多关于found标志的建议,但你并不需要一个。这就是for环路上的else的作用:

lst = [-1, 2, -3, 4, -5, 1]
# zip lst with a slice of itself to get corresponding
# elements offset by 1 position
for a, b in zip(lst, lst[1:]):
if a * b > 0:
print(f"Found pair {a} {b}")
break
else:
print("NONE")

else只会在for循环完成时触发(break没有提前结束)