有没有办法适当地继续这个while循环?

时间:2019-11-20 21:36:59

标签: python-3.x reduce

我编写了一个函数,其中输入是数字(项目)列表,长度是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

2 个答案:

答案 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)

引入变量abc帮助我更好地阅读了代码。

答案 1 :(得分:0)

逻辑并不完全正确。想象一个简单的[1, 1, 0]输入。通过查看此值,中位数应为1,但是使用><而不是<=>=时,代码将最终输入else之所以封锁,是因为1<1False,而1>1也是False。最后的else块将结果设置为等于第三个元素0

将您的运算符切换为>=<=即可解决此问题。 for循环底部的break在一次迭代后立即中断,因此也需要删除。

如果您有一个元素的列表(3 ** 0 = 1),则当您尝试在循环中获取第二和第三元素时,您将以IndexError结尾。

所以我们需要

  1. 切换操作员也要测试是否相等
  2. 删除错误的中断
  3. 处理基本情况
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