找到输入中值的快速方法

时间:2018-03-10 09:21:26

标签: python python-3.x algorithm optimization statistics

所以我发现了一个' Stream'来自输入的数字。输入长度从1到4999999不等。(鉴于它是一个奇数)。

时间限制为5秒。

我目前的代码应该是直截了当的:

import statistics
array = []
n = int(input())
for _ in range(n):
    array.append(int(input()))
print (int(statistics.median(array)))

但我在某些情况下得到了TLE。问题应该是因为循环for _ in range(n)太慢了。

有没有办法既可以加快阅读输入过程,也可以在读取常量输入时计算中位数?

(我知道问题出在循环中只是在循环后放置print ('Done') ...或者是因为追加了吗?)

4 个答案:

答案 0 :(得分:1)

我发现以下内容比input/append快得多:

import statistics
from sys import stdin
n = int(stdin.readline())  # unused below, stdin terminates on EOF
l = list(map(int, stdin.read().split()))  # read rest of file in one gulp, split & map it
print(int(statistics.median(l)))

答案 1 :(得分:0)

你可以做几件事:

  • 停止调用列表数组

简化输入:

numbers = sorted(map(int, (input() for _ in range(int(input()))))

自己计算中位数:

def median(nums:list) : 
    l = len(nums)

    if l%2 == 1:
        return nums[l//2]
    else:
        return sum(nums[l//2-1:l//2+1])/2

总计:

print(median(sorted(map(int, (input() for _ in range(int(input())))))))

答案 2 :(得分:0)

虽然这不是一个标准答案,但我只是转而使用C ++并轻松通过。

(是的,我在30分钟内学到了它。)

In [8]: df = pd.read_clipboard(sep=';')  # should be same like pd.read_csv
In [9]: df.set_index("Date")[['Open', 'High', 'Low', 'Last Close', 'Total Volume']]
Out[9]:
              Open    High     Low  Last Close Total Volume
Date
02/10/2017  29.345  29.375  29.005      29.105    1,106,900
02/13/2017  29.100  30.050  29.100      29.870    1,715,810
02/14/2017  29.710  30.150  29.665      30.100    1,225,914
02/15/2017  30.190  30.300  29.865      29.950    1,406,422
02/16/2017  29.815  29.940  29.585      29.770    1,245,004

答案 3 :(得分:0)

使用numpy可以在python中实现更高效的实现 和发电机:

import numpy as np

n = int(input())
array = np.fromiter((int(input()) for _ in range(n)), np.int32)
print(int(np.median(array)))

但是,由于我无法通过在线评判来检查这个新解决方案,因此不清楚它是否足够快。