【问题标题】:Python dictionary for and if loopPython 字典 for 和 if 循环
【发布时间】:2017-07-21 05:52:17
【问题描述】:

我对 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”有四个“通话”场景,两个“短信”和一个“彩信”。 我以为我可以在字典中执行此操作,所以我创建了一个 tot 变量用作字典中的键并创建了字典(如下所示),但我不确定如何使用 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

【问题讨论】:

  • 首先,你为什么认为你需要那个 tot 变量?,这是有用的还是必要的?其次,您可以将移动列表用作字典中的键,并将测试变量中的对应关系用作值,然后使用该信息进行计数
  • 您能否提供一个您希望看到的结果示例?
  • 当我尝试 zip(Mobile,Test) 时,创建的字典只有两个项目('M1','call')和('M2','voltecall')。我想也许字典需要一个唯一的键变量,这就是我创建 tot 变量的原因。我想看到的是这样的; ('M1','call',4),('M1','sms',2),('M1','mms',1) 等等。

标签: python dictionary if-statement for-loop count


【解决方案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库,它使这种类型的分组操作更直接。

【讨论】:

  • 感谢您的帮助。是否可以逐个打印计数。当我试图找到计数类型时,我得到一个响应 collections.defaultdict。我尝试打印 count[1] 但收到错误消息。
  • count 是一个字典,要访问元素,您需要提供密钥:count['M1']count['M2'] 例如。
  • 一个后续问题,如果我有两个以上的列表要组合在字典中会发生什么。例如,我还有一个列表,指示测试中的哪些项目是“成功”或“错误”或“跳过”。如何创建一个新字典并按照您用三个列表指示的那样计数?
  • 然后将count 设为嵌套的defaultdict。从理论上讲,您可以嵌套尽可能多的级别。
【解决方案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)]

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多