有没有办法让这个功能更快
Is there any way to make this function faster
我正在编写这个函数,首先我使用了循环。循环需要时间来尝试列表理解。它没有用。此功能允许 10 秒。请检查一下。函数 return 对比率为 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
这一行需要优化:
cust_dict = {i: customers.count(i)/tot for i in set_cust}
它是客户数量的二次方,因为 customers.count(i)
将为 set_cust
中的每个客户遍历整个 customers
列表。
相反,您可以循环 customers
一次并在字典中跟踪计数器,然后在末尾除以 tot
。
或者您也可以使用 collections.Counter
from collections import Counter
tot = len(customers)
[k for k, v in Counter(customers).items() if (v / tot >= 0.05)]
另一种 object-oriented 方法:
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
我正在编写这个函数,首先我使用了循环。循环需要时间来尝试列表理解。它没有用。此功能允许 10 秒。请检查一下。函数 return 对比率为 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
这一行需要优化:
cust_dict = {i: customers.count(i)/tot for i in set_cust}
它是客户数量的二次方,因为 customers.count(i)
将为 set_cust
中的每个客户遍历整个 customers
列表。
相反,您可以循环 customers
一次并在字典中跟踪计数器,然后在末尾除以 tot
。
或者您也可以使用 collections.Counter
from collections import Counter
tot = len(customers)
[k for k, v in Counter(customers).items() if (v / tot >= 0.05)]
另一种 object-oriented 方法:
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