【问题标题】:Finding median without using a sort function不使用排序函数查找中位数
【发布时间】:2012-09-07 21:35:06
【问题描述】:

作为家庭作业,我必须编写一个脚本,它可以在不使用 Python 的标准排序函数的情况下找到 3 个给定数字的中位数。

这是我上课的第一周,也是我的第一次编程体验,所以我发现很难比现在更进一步。

这是我目前所拥有的:

def med3(a,b,c):
    list = [a, b, c]
    newlist = []
    if list:
        minimum = list[0]
        for x in list:
            if x < minimum:
                minimum = x
                newlist.append(minimum)
                list.remove(minimum)
            elif x >= minimum:
                newlist.append(x)
                list.remove(x)

    return newlist[1]

这似乎可以解决问题,但仅适用于列表的前两个条目。该循环不包括第三个条目。

如何使脚本包含所有三个条目?

提前致谢! 砂光机

【问题讨论】:

  • 工作量太大。在不使用循环和列表的情况下定义“中位数”在 3 个数字的上下文中的含义。
  • 那里有很多真正不需要的代码。也因为这是作业,你自己想办法,不是我们帮你做的……
  • 欢迎来到 Stack Overflow!这里有许多不必要的步骤。例如,if list: 是不必要的:您刚刚定义了列表。但一般来说,您不需要列表或循环。提示:您可以使用三个if 语句来执行此操作,每个语句都使用一个or
  • 我建议找出一种技术来找出 3 个给定数字的中位数在你的脑海中。用英语写下这个技巧,就像给别人一个食谱一样。最后使用编程语言对这种技术进行编码。 (将您的文本称为伪代码,您就是真正的程序员;-)

标签: python median


【解决方案1】:

sum([a, b, c]) - min(a, b, c) - max(a, b, c) - 没有排序!

【讨论】:

    【解决方案2】:

    您在循环遍历列表时就地修改列表,这会对您看到的元素产生影响:

    >>> numbers = [1,2,3]
    >>> for i in numbers:
    ...     if i == 2: numbers.remove(i)
    ...     print i
    ... 
    1
    2
    

    注意3 是如何从不打印的;通过删除列表中的第二个条目,我们将其缩短了一个元素,并且循环发现列表提前耗尽。

    请注意,您不需要循环遍历这些项目,如果您仔细考虑一下,一些简单的比较就会告诉您哪个项目是中位数。 :-)

    【讨论】:

      【解决方案3】:

      有许多更简单的方法可以解决这个问题,但至于你的方法:

      您正在循环内修改list。不要那样做。 :)

      在您的情况下,您应该从新列表中删除元素:

      def med3(a,b,c):
          list = [a, b, c]
          newlist = []
          if list:
              minimum = list[0]
              for x in list:
                  if x < minimum:
                      minimum = x
                      newlist.pop()
                      newlist.append(minimum)
                  elif x >= minimum:
                      newlist.append(x)
          return newlist[1]
      

      但作为练习,您可能需要考虑以下几点:

      • 为什么要将元素放在列表中并循环遍历它们?这与将 a、b、c 与简单的 if 语句进行比较相比有什么优势?

      • 为什么是if list:

      【讨论】:

        【解决方案4】:

        最快的方法:

        def medianFast(a, b, c):
            if a > b:
                if b > c: 
                    return b
                elif a > c:
                    return c
                else:
                    return a
            else:
                if b < c: 
                    return b
                elif a > c:
                    return a
                else:
                    return c
        

        保证在最坏情况下进行 3 次比较,在最佳情况下进行 2 次比较。平均 2,5 次比较。

        使用ternary conditional,我们可以把它写得更短:

        def medianTernary(a, b, c):
            return (b if b > c else (c if a > c else a)) if a > b else (b if b < c else (a if a > c else c))
        

        如果你可以使用排序,你会得到最短的版本:

        def medianSorted(a, b, c):
            return sorted([a, b, c])[1]
        

        【讨论】:

          猜你喜欢
          • 2015-03-31
          • 2020-02-25
          • 2019-12-12
          • 1970-01-01
          • 2016-03-02
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多