和if循环的Python字典

2024-10-01 02:36:42 发布

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

我对Python很陌生。这个问题可能很简单。 我有两份清单如下:

Mobile=  ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2')
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall')

我想写一个循环来计算Mobile中每个值的每个测试项执行了多少次。例如,我希望代码告诉我“M1”有四个“呼叫”场景,两个“短信”和一个“彩信”。 我想我可以在dictionary中这样做,所以我创建了一个tot变量作为dictionary中的键,并创建了dictionary(如下所示),但是我不知道如何使用for和if语句来实现我想要的功能。我在下面写的代码没有给出正确的答案。它只返回零。你知道吗

Mobile=  ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2')
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall')
tot=(1,2,3,4,5,6,7,8,9,10,11,12,13,14)

a_dict=dict(zip(tot,zip(Mobile,Test)))

for k, v in a_dict.iteritems():
    if (k==Mobile[1] and v==Test[1]):
        countM1Test1+=1

Tags: 代码testfordictionaryifzipmobilecall
2条回答
from collections import Counter
pairs = zip(*(Mobile, Test))
c = Counter(pairs)
print c.items()

输出:

[(('M1','sms'),2),('M2','voltecall'),3),('M1','call'),4),('M2','mms'),2),('M2','sms'),2),('M1','mms'),1)]

可以将defaultdictCounter一起使用,如下所示:

from collections import defaultdict, Counter
​
count = defaultdict(Counter)
for m, t in zip(Mobile, Test):
    count[m].update({t: 1})

count
# defaultdict(collections.Counter,
#             {'M1': Counter({'call': 4, 'mms': 1, 'sms': 2}),
#              'M2': Counter({'mms': 2, 'sms': 2, 'voltecall': 3})})

如果您想要一个元组列表,可以通过列表理解轻松地从上面的字典count中提取元组:

[(k, a, c) for k, v in count.items() for a, c in v.items()]

# [('M1', 'mms', 1),
#  ('M1', 'sms', 2),
#  ('M1', 'call', 4),
#  ('M2', 'mms', 2),
#  ('M2', 'sms', 2),
#  ('M2', 'voltecall', 3)]

更新:

如果有三个列表,则可以创建嵌套的defaultdict

Mobile=  ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2')
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall')
Response = ('error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success')

from collections import defaultdict, Counter

count = defaultdict(lambda : defaultdict(Counter))
for m, t, r in zip(Mobile, Test, Response):
    count[m][t].update({r: 1})

注意:如果您还有更多,我建议您查看pandas库,它使这种类型的分组操作更直接。你知道吗

相关问题 更多 >