计算元组中的元素

2024-03-29 01:45:14 发布

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

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

{'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"的最后一个值。我试过这样做,但它不起作用,我的计数器不会增加。在

^{pr2}$

Tags: falsenewdatetimestatusorigineventsticketdepartment
3条回答

看起来你读错了要计数的元素,状态事件是元组的列表。在

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

如果只关心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中每个项目的值,则必须为其创建另一个循环:

^{pr2}$

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

下面的内容可以满足您的需要。它使用Python的Counter类来计算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()

这将显示如下饼图:

enter image description here

如果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

然后你就遇到了一个问题,因为你要迭代这些项,然后调查这些值。i和{}将取如下值:

^{pr2}$

你不能期望在这些值中找到任何“状态事件”。取而代之的是你必须直接查阅这样一本词典。比如:

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

相关问题 更多 >