我有一个列表:
CASE 1 : group_member = ['MEU1', 'MEU1','MEU2', 'MEU1','MEU1','MEU2','MEU1','MEU2','MEU1','MEU3']
CASE 2 : group_member = ['MEU1','MEU2','MEU3','None','None']
CASE 3 : group_member = ['MEU1','MEU2','MEU3','MEU1','CEU1']
我想做的是在sql中插入一个值,如果列表的70%具有相同的值或发送邮件给一些用户,如果值低于70%。
对于我上面的列表,它将是第一种情况,因为EU1值大于70%。
我试过这样做:
from collections import Counter
freqDict = Counter(group_member)
size = len(group_member)
if len(group_member) > 0 :
for (key,val) in freqDict.items():
if (val >= (7*size/10)):
print(">= than70%")
insert_into_table(group)
elif (val <(7*size/10)) :
print("under 70%")
send_mail_notification(group)
这样做的问题是,它将检查键和值的每个组合,这意味着即使一个值是>= 70%,它仍然会进入elif
并为同一组多次发送邮件,这是不可接受的,但我还没有找到解决方案。
我怎样才能避免这种情况?对于上面的列表,它应该只在表中插入值,然后移动到下一个列表,对于第二个列表,它应该只发送一次邮件通知,因为没有元素>=70%。
我需要实现以下情况:
如果>=70%是相同的值(例如CASE1中的MEU1),则插入到表中。
IF>=70%在同一个单位(M),但不是同一个部落,所以在CASE 3中,因为5个元素中有4个有M,它们属于同一个单位——>发送通知
我认为您应该检查是否至少有一个项目的值大于或等于70,然后发送邮件,如果没有这样的值。这意味着你应该在浏览完列表后检查是否应该发送邮件。
from collections import Counter
freqDict = Counter(group_member)
size = len(group_member)
foundBigVal = False
if len(group_member) > 0 :
for (key,val) in freqDict.items():
if (val >= (7*size/10)):
print(">= than70%")
insert_into_table(group)
foundBigVal = True
break #no need to check the list further since only one can have %70 percent
if foundBigVal:
#if there's a value greater than %70 in the list, we would enter this part
print("under 70%")
send_mail_notification(group)
我把if放在循环之外,以便调用send_mail_notification
一次,但检查列表中的每个元素。
你可以试试这样
a = ['EU1', 'EU1','EU2', 'EU1','EU1','EU2','EU1','EU2','EU1','EU3']
max_percentage = Counter(a).most_common(1)[0][1]/len(a)*100
most_common(1)[0]
返回(most_common_element, its_count)
形式的元组。我们只需提取计数并将其除以列表的总长度即可得到百分比。
虽然上面列表中EU1
的百分比似乎是60%,而不是你提到的70%。