有什么办法可以使此功能更快

时间:2020-09-08 06:51:59

标签: python loops list-comprehension

我正在编写此函数,首先我正在使用循环。循环需要时间,因为我尝试了列表理解。它没有用。此功能允许10秒。请检查一下。函数返回排序比例为5%或更高的公司的列表。

def mostActive(customers):
    # Write your code here
    tot = len(customers)
    set_cust = set(customers)
    cust_dict = {i: customers.count(i)/tot for i in set_cust}
    cus_list = [i for i in list(cust_dict) if cust_dict[i] >= 0.05]
    return sorted(cus_list)

样本输入和输出

Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Alpha
Omega
Beta

预期输出:

Alpha
Beta
Omega

3 个答案:

答案 0 :(得分:6)

或者,您也可以使用collections.Counter

SolutionGuid

答案 1 :(得分:2)

此行需要优化:

cust_dict = {i: customers.count(i)/tot for i in set_cust}

这是客户数量的四倍,因为customers.count(i)将为customers中的每个客户遍历整个set_cust列表。

相反,您可以循环customers一次并跟踪字典中的计数器,然后最后除以tot

答案 2 :(得分:0)

另一种面向对象的方法:

from collections import Counter


class FreqCounter(Counter):
    def most_common(self, *args, **kwargs):
        total = sum(self.values())
        return list(map(lambda x: (x[0], x[1]/total), super().most_common(*args, **kwargs)))


def most_active(customers):
    most_active_customers = []
    for customer, freq in FreqCounter(customers).most_common():
        if freq < 0.05:
            break
        most_active_customers.append(customer)
    return sorted(most_active_customers)  # Remove sorted if needed in frequency order instead of name order


customers = [
    'Omega', 'Alpha', 'Omega', 'Alpha', 'Omega',
    'Alpha', 'Omega', 'Alpha', 'Omega', 'Alpha',
    'Omega', 'Alpha', 'Omega', 'Alpha', 'Omega',
    'Alpha', 'Omega', 'Alpha', 'Omega', 'Beta',
]
for customer in most_active(customers):
    print(customer)

输出:

Alpha
Beta
Omega

通过按照指示删除sorted,输出将是:

Omega
Alpha
Beta