有效地计算小于给定值的列表条目

时间:2015-06-14 12:04:05

标签: python performance list python-2.7

我有两个列表,一个包含员工工资,另一个包含查询。对于每个查询,我想打印多少员工工资。

下面你可以找到我目前使用的代码,它超出了我对大输入的时间限制。因此,我正在寻找更有效的解决方案。

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
    count = 0
    for ep in sal:
        if ep < i:
            count +=1
    print count

3 个答案:

答案 0 :(得分:3)

我不知道这比你的解决方案更快(或更慢)。您可以使用timeit模块来确定您的大输入。

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
   print sum(1 for s in sal if s < i)

根据数据大小,您可以事先对工资和查询进行排序,然后您只需要对列表进行一次传递:

idx = 0
sal = sorted(sal)
count = 0
for q in sorted(queries):
    while sal[idx] < q:
        count += 1
        idx += 1
    print count

对于长输入,第二种方法会更快,但对于较短的输入可能会更慢 - 您必须使用代表性数据进行分析。如果您的数据已经排序,则此方法将非常快。

答案 1 :(得分:1)

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
    count = sum([1 for for ep in sal if ep < i])
    print count

答案 2 :(得分:1)

在已排序的bisect列表中使用sal

import bisect

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
sal.sort()
for i in q:
    print bisect.bisect_left(sal, i)

bisect执行对数搜索,其中sal < i的最大元素为。{1}}。对于大型列表,对于具有两个for循环的其他解决方案,复杂度为O(N * log(N))而不是O(N ** 2)。对于大数N,这个速度要快得多。