计算元组中的元素

Counting elements in tuple

我有很多票据字典都是这样的:

{'origin': u'HW', 
'department': u'Intern', 
'ticket-closed': False, 
'prio-events': [(datetime.datetime(2015, 6, 8, 17, 30, 17, 490990, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'Important')], 
'status-events': [(datetime.datetime(2015, 6, 8, 17, 30, 17, 490990, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'new'), (datetime.datetime(2015, 7, 22, 16, 41, 52, 408334, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'developing')]}

{'origin': u'HW', 
'department': u'Intern', 
'ticket-closed': False, 
'prio-events': [(datetime.datetime(2015, 6, 8, 17, 39, 34, 351329, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'Important')], 
'status-events': [(datetime.datetime(2015, 6, 8, 17, 39, 34, 351329, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'new')}

{'origin': u'HW', 
'department': u'Intern', 
'ticket-closed': False, 
'prio-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'Important')], 
'status-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'new'), (datetime.datetime(2015, 7, 22, 16, 42, 49, 339349, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'closed')]}

我想在matplotlib中制作一个饼图来显示有多少票是'new'、'developing'或'closed',因此我需要检查最后一个值的 "status-events" 我试过这样但它不起作用,我的计数器不增加。

newCounter = 0
closedCounter = 0
developingCounter = 0


for (i,j) in OpenedDict.iteritems():
    if j['status-events'][-1]== 'new':
        newCounter += 1
    if j['status-events'][-1]== 'closed':
        closedCounter += 1
    if j['status-events'][-1]== 'developing':
        developingCounter += 1

您似乎读错了要计数的元素,status-events 是一个元组列表。

要追踪它未被正确读取的原因,请尝试将 j['status-events'][-1] 打印到终端以查看您正在比较的值。现在,这将 return 一个元组。

如果你只关心status-events列表中的最后一项,你可以将脚本修改为:

for (i,j) in OpenedDict.iteritems():
    if j['status-events'][-1][-1] == 'new':
        newCounter += 1
    if j['status-events'][-1][-1] == 'closed':
        closedCounter += 1
    if j['status-events'][-1][-1] == 'developing':
        developingCounter += 1

否则,如果您想要列表中每个项目的值 status-events,您必须为其创建另一个循环:

for (i,j) in OpenedDict.iteritems():
    for k in j['status-events']:
        if k[-1] == 'new':
            newCounter += 1
        if k[-1] == 'closed':
            closedCounter += 1
        if k[-1] == 'developing':
            developingCounter += 1

除此之外,您似乎在第二个示例中缺少括号。

如果 OpenedDict 确实是列出的 dict 之一,也就是说 MVCE 看起来像:

OpenedDict = {'origin': u'HW', 
'department': u'Intern', 
'ticket-closed': False, 
'prio-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'Important')], 
'status-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'new'), (datetime.datetime(2015, 7, 22, 16, 42, 49, 339349, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'closed')]}

newCounter = 0
closedCounter = 0
developingCounter = 0

for (i,j) in OpenedDict.iteritems():
    if j['status-events'][-1]== 'new':
        newCounter += 1
    if j['status-events'][-1]== 'closed':
        closedCounter += 1
    if j['status-events'][-1]== 'developing':
        developingCounter += 1

那么您遇到了问题,因为您正在迭代项目然后调查值。例如,ij 将采用以下值:

i = 'origin'
j = u'HW'

i = 'department'
j = u'Intern'

i = 'ticked-closed'
j = False

等您不能指望在这些值中找到任何 'status-events'。相反,您将不得不直接检查这样的字典。类似于:

OpenedDict = {'origin': u'HW', 
'department': u'Intern', 
'ticket-closed': False, 
'prio-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'Important')], 
'status-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'new'), (datetime.datetime(2015, 7, 22, 16, 42, 49, 339349, tzinfo=<LocalTimezone "UTC+02:00" 2:00:00>), u'closed')]}

newCounter = 0
closedCounter = 0
developingCounter = 0

if OpenedDict['status-events'][-1]== 'new':
    newCounter += 1
if OpenedDict['status-events'][-1]== 'closed':
    closedCounter += 1
if OpenedDict['status-events'][-1]== 'developing':
    developingCounter += 1

以下应该满足您的需求。它利用 Python 的 Counter class 来计算每个 status-events 类型,然后在饼图中显示整理的信息:

import matplotlib.pyplot as plt
import datetime
from collections import Counter

events = [
    {'origin': u'HW', 
    'department': u'Intern', 
    'ticket-closed': False, 
    'prio-events': [(datetime.datetime(2015, 6, 8, 17, 30, 17, 490990), u'Important')], 
    'status-events': [(datetime.datetime(2015, 6, 8, 17, 30, 17, 490990), u'new'), (datetime.datetime(2015, 7, 22, 16, 41, 52, 408334), u'developing')]},

    {'origin': u'HW', 
    'department': u'Intern', 
    'ticket-closed': False, 
    'prio-events': [(datetime.datetime(2015, 6, 8, 17, 39, 34, 351329), u'Important')], 
    'status-events': [(datetime.datetime(2015, 6, 8, 17, 39, 34, 351329), u'new')]},

    {'origin': u'HW', 
    'department': u'Intern', 
    'ticket-closed': False, 
    'prio-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331), u'Important')], 
    'status-events': [(datetime.datetime(2015, 6, 8, 17, 49, 58, 454331), u'new'), (datetime.datetime(2015, 7, 22, 16, 42, 49, 339349), u'closed')]}]

event_types = Counter()

for event in events:
    for status in event['status-events']:
        event_types[status[1]] += 1

plt.pie(event_types.values(), labels=event_types.keys(), autopct='%1.1f%%')
plt.axis('equal')
plt.show()

这将显示如下饼图: