我试图获得一些整数的运行中位数。例如: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]
答案 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)