我正在编写此函数,首先我正在使用循环。循环需要时间,因为我尝试了列表理解。它没有用。此功能允许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
答案 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