根据元素在列表中出现多少次执行操作

2024-10-01 07:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份清单:

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']

我试图做的是,如果列表的70%具有相同的值,则在sql中的表中插入一个值;如果值低于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%.

我需要实施以下情况:

  1. 如果>=70%为相同值(案例1中为MEU1),然后插入表格

  2. 如果>=70%属于同一单位(M),但不属于同一部落,因此在案例3中,由于5个元素中有4个元素具有M,因此它们属于同一单位-->;发送通知


Tags: gtnone元素列表sizecountergroup邮件
2条回答

我认为你应该检查是否有至少一个项目的价值大于或等于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%

相关问题 更多 >