Python:如何根据特定键值仅打印字典中的实际值?

时间:2015-03-18 15:14:40

标签: python dictionary printing

我有一个根据Splunk搜索结果动态生成的字典。字典的内容如下所示:

SiteID     Reporting   Total
FLNGAASF1  3           9  
MSNGAASF2  14          26  
PANGAASF1  31          40 

这是我生成字典的Python代码:

SiteIDs = defaultdict(list)
SiteIDs.clear()

Splunk搜索到此处

for result in results.ResultsReader(jobC.results(segmentation='none')):
   SiteID=result["SiteID"]
   Reporting=result["Reporting"]
   Total=result["Total"]
   SiteIDs[SiteID].append(('Reporting',Reporting))
   SiteIDs[SiteID].append(('Total',Total))

现在我需要做的是获取特定SiteID的报告和总数。例如,假设我想要MSNGAASF2的报告和总数,以便我可以在HTML表中打印它们:

14/26

或者像这样

SiteID     Clients
FLNGAASF1  0/9  
MSNGAASF2  14/26  
PANGAASF1  0/40 

所以我打破了这样的词典条目:

Client=(SiteIDs['MSNGAASF2'])

这样做:

print Client,"<br />"

结果如下:

[(&#39;报告&#39;,&#39; 14&#39;),(&#39; Total&#39;,&#39; 26&#39;)]

如果我尝试替换功能,我会收到一个错误,即替换不是列表对象中的支持属性。无论我尝试什么,我都会收到一条错误,指出该属性不受支持。

我已经尝试过这样的事情,但绝对没有运气。

print Client.get('MSNGAASF2ULLSA',0)," / ",Client.get('MSNGAASF2ULLSA',1)

得到这个:

print Client.get(&#39; MSNGAASF2&#39;,0),&#34; /&#34;,Client.get(&#39; MSNGAASF2&#39;,1)AttributeError:&#39; list&#39;对象没有属性&#39; get&#39;

我想要做的就是打印所选SiteID的值,只打印值。这可能不是那么难,但作为一个noob python开发人员,我似乎无法弄明白。

我需要这样做,因为我有第二个Splunk搜索列出了所有SiteID,我需要每个都有特定的计数。循环虽然第一个Splunk搜索结果需要永远。我希望使用字典的速度要快得多。

2 个答案:

答案 0 :(得分:2)

你要附加两个单独的元组;用新词典替换这两个元组:

for result in results.ResultsReader(jobC.results(segmentation='none')):
    site_id = result["SiteID"]
    reporting = result["Reporting"]
    total = result["Total"]
    SiteIDs[site_id].append({'Reporting': reporting, 'Total': total})

你甚至可以只追加整个result字典而不是提取两个密钥。

然后,您可以在代码中引用这些键; SiteIDs中的每个值都是一个列表,因此您可以遍历列表以获取每个单独的字典:

results = SiteIDs['MSNGAASF2']
for result in results:
    print '<td> {Reporting} </td><td> {Total} </td>'.format(**result)

我在这里使用str.format() template;允许您使用模板中result中的键将特定值提取到字符串中。

现在,如果Splunk结果集中的SiteID值始终是唯一的,那么使用defaultdict(list)是过度的;您可以使用常规字典,只需将SiteID的结果字典存储在那里:

for result in results.ResultsReader(jobC.results(segmentation='none')):
    SiteIDs[result["SiteID"]] = result

然后放弃每个id的循环:

result = SiteIDs['MSNGAASF2']
print '<td> {Reporting} </td><td> {Total} </td>'.format(**result)

答案 1 :(得分:0)

默认字典生成列表字典。如果你想要一个真正的字典,你应该像这样构造它:

mydict = {'FLNGAASF1': {'Reporting': 3, 'Total': 9}}
你也可以去:

mydict['FLNGAASF1'] = {'Reporting': 3, 'Total': 9}

然后检索数据:

print(mydict['FLNGAASF1'])
>>> {'Reporting': 3, 'Total': 9}

完整示例(假设您的splunk搜索结果是可迭代的):

mydict = {}
for row in splunk:
    mydict[row['SiteID']] = {'Reporting': row['Reporting'], 'Total': row['Total']

然后只需打印您的打印值:

for k, v in mydict.items():  
    print("Client: %s: %d/%d" % (k, v['Reporting'], v['Total']))

>>>Client: FLNGAASF1: 3/9
>>>Client: MSNGAASF2: 14/26