计算元组中的元素
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
那么您遇到了问题,因为您正在迭代项目然后调查值。例如,i
和 j
将采用以下值:
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()
这将显示如下饼图:
我有很多票据字典都是这样的:
{'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
那么您遇到了问题,因为您正在迭代项目然后调查值。例如,i
和 j
将采用以下值:
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()
这将显示如下饼图: