计数值出现在列中的次数

时间:2014-02-21 15:54:15

标签: python django django-views

我有一个数据库,正在编写一个django查询集来循环遍历下面的列

distinct_event_identifier=Plasoevt.objects.values('source_name')

一个source_name可以在列中出现多次。所以我想要一个查询来打印每个唯一的source_name以及它在列中出现的次数。 我希望它以这种格式打印出来:

{ source_name: 'MCUpdate', frequency: 30 },//where frequency is the number of times a particular source_name appears in the column
     { source_name: 'LoadPerf', frequency: 30},
     { source_name: 'WinMgmt', frequency: 30 },

任何人都可以提供见解吗? 此致

2 个答案:

答案 0 :(得分:0)

您可以使用annotate

distinct_event_identifier=Plasoevt.objects.values('source_name').annotate(frequency = Count('source_name'))

答案 1 :(得分:0)

我建议在集合中使用计数器并使用上下文语义来呈现此数据。 (Counter是Python 2.7以后的dict子类)

import collections

创建我们的数据列,这些数据长度为90个项目(我将随机随机播放,因为这可能会模拟您的数据):

import random
event_column = ((['MCUpdate'] * 30) + # This is a list of events that 
                (['LoadPerf'] * 30) + # will be passed to the Counter
                (['WinMgmt'] * 30))
random.shuffle(event_column)
print('length of the column is ' + str(len(event_column))) # i.e. 90
print('first 10 items are:')
print(event_column[:10])

打印:

['WinMgmt', 'MCUpdate', 'LoadPerf', 'LoadPerf', 'WinMgmt', 
 'MCUpdate', 'WinMgmt', 'MCUpdate', 'MCUpdate', 'MCUpdate']

然后我们计算他们的频率:

event_counts = collections.Counter(event_column)
import pprint
pprint.pprint(event_counts)

打印出来:

Counter({'MCUpdate': 30, 'LoadPerf': 30, 'WinMgmt': 30})

并且

for event, count in event_counts.items(): # use iteritems() in Python 2
    print('{event}: {count}'.format(event=event, count=count))

打印

MCUpdate: 30
LoadPerf: 30
WinMgmt: 30

将其放入所需的格式:

redundant_counts = []
for source_name, frequency in event_counts.items():
    redundant_counts.append({'source_name': source_name, 'frequency': frequency})
print(redundant_counts)

打印:

[{'source_name': 'WinMgmt', 'frequency': 30}, {'source_name': 'MCUpdate', 'frequency': 30}, {'source_name': 'LoadPerf', 'frequency': 30}]