我编写了一个函数,其中输入是数字(项目)列表,长度是3的倍数。
我希望此功能继续,直到项目中只剩下1个值。
while len(items) > 1:
for x in range(0, len(items), 3):
if items[x] < items[x+1] < items[x+2] or items[x] > items[x+1] >items[x+2] :
result.append(items[x+1])
elif items[x+1] < items[x] < items[x+2] or items[x+1] > items[x] > items[x+2]:
result.append(items[x])
else:
result.append(items[x+2])
items = result
break
return items
答案 0 :(得分:1)
猜测您需要什么以及代码应如何显示...
items = [99, 42, 17, 7, 1, 9, 12, 77, 15]
while len(items) > 1:
result = []
for x in range(0, len(items), 3):
a, b, c = items[x], items[x+1], items[x+2]
if a < b < c or a > b >c :
result.append(b)
elif b < a < c or b > a > c:
result.append(a)
else:
result.append(c)
items = result
print(items)
引入变量a
,b
和c
帮助我更好地阅读了代码。
答案 1 :(得分:0)
逻辑并不完全正确。想象一个简单的[1, 1, 0]
输入。通过查看此值,中位数应为1
,但是使用>
和<
而不是<=
和>=
时,代码将最终输入else
之所以封锁,是因为1<1
是False
,而1>1
也是False
。最后的else块将结果设置为等于第三个元素0
。
将您的运算符切换为>=
和<=
即可解决此问题。 for循环底部的break
在一次迭代后立即中断,因此也需要删除。
如果您有一个元素的列表(3 ** 0 = 1),则当您尝试在循环中获取第二和第三元素时,您将以IndexError
结尾。
所以我们需要
def median_split3(items):
if len(items) == 1: # Base Case
return items[0]
while len(items) > 1:
result = []
for x in range(0, len(items), 3):
a, b, c = items[x:x+3]
if a <= b <= c or a >= b >= c:
result.append(b)
elif b <= a <= c or b >= a >= c:
result.append(a)
else:
result.append(c)
items = result
return items[0]
test1 = [99, 42, 17, 7, 1, 9, 12, 77, 15]
print(test1, "-->", median_split3(test1))
test2 = [1, 1, 0]
print(test2, "-->", median_split3(test2))
test3 = [0, 0, 1]
print(test3, "-->", median_split3(test3))
test4 = [9]
print(test4, "-->", median_split3(test4))
输出:
[99, 42, 17, 7, 1, 9, 12, 77, 15] --> 15
[1, 1, 0] --> 1
[0, 0, 1] --> 0
[9] --> 9