获得运行中位数时出错

时间:2016-10-18 18:26:50

标签: python python-2.7

我试图获得一些整数的运行中位数。例如:6个元素将逐个出现,比如12,4,5,3,8,7,其中每个输入的运行中位数分别为12,8,5,4.5,6,5。我写了一个python代码,但似乎给出了错误的答案。感谢帮助。

n = int(raw_input().strip())
s=[]
for i in xrange(n):
    a=int(raw_input())
    if len(s)==0: 
        s.append(a)
        print "%.1f" % a
    else:
        for j in xrange(len(s)):
            if a<s[j]:
                s.insert(j,a)
        if a>=s[-1]:
            s.append(a)
        if len(s)%2==0:
            print "%.1f" % float((s[len(s)/2] + s[len(s)/2 -1])/2.0)
        else:
            print  "%.1f" % s[len(s)/2]

2 个答案:

答案 0 :(得分:1)

n = int(raw_input().strip())
s=[]
for i in xrange(n):
    a=int(raw_input())
    if len(s)==0: 
        s.append(a)
        print "%.1f" % a
    else:
        for j in xrange(len(s)):
            if a<s[j]:
                s.insert(j,a)
                break # inserted this break
        if a>=s[-1]:
            s.append(a)
        if len(s)%2==0:
            print "%.1f" % float((s[len(s)/2] + s[len(s)/2 -1])/2.0)
        else:
            print  "%.1f" % s[len(s)/2]

这是输出和输入:

 6
 12
12.0
 4
8.0
 5
5.0
 3
4.5
 8
5.0
 7
6.0

问题发生在您插入的for j in xrange(len(s))中,只要a小于下一个值即可。您没有只插入一次,这会在列表中添加超出您想要的值。添加break只会在找到它所属的第一个点时插入一次。

答案 1 :(得分:1)

阅读以下代码中嵌入的评论 -

n = int(raw_input().strip())
s=[]
for i in xrange(n):
    a=int(raw_input())
    if len(s)==0:
        s.append(a)
        print "%.1f" % a
    else:
        for j in xrange(len(s)):
            if a<s[j]:
                s.insert(j,a)
                break  # break after insertion to avoid multiple insertions
        else:  # Read https://docs.python.org/3/reference/compound_stmts.html#for
            s.append(a)

        if len(s)%2==0:
            print "%.1f" % float((s[len(s)/2] + s[len(s)/2 -1])/2.0)
        else:
            print  "%.1f" % s[len(s)/2]

更多 Pythonic (原文如此)的做法 -

import bisect

n = int(raw_input().strip())
s=[]
for i in xrange(n):
    a=int(raw_input())

    bisect.insort_left(s, a)

    quotient, remainder = divmod(len(s), 2)
    if remainder:
        print  "%.1f" % s[quotient]
    else:
        print "%.1f" % ((s[quotient - 1] + s[quotient])/2.0)