在Python Splunk SDK中,ResultsReader object提供了一个可迭代的对象,在访问时返回OrderedDict。我想将OrderedDict中包含的值存储到一个集合中,以对预期值列表执行set subtraction。我无法找到一种方法来访问OrderedDict中的值,这种方式允许我将它们存储到一个集合中。
代码示例:
kwargs_search = {"exec_mode": "normal"}
searchquery = "search index=* earliest=-1d| stats values(host)"
job = service.jobs.create(searchquery, **kwargs_search)
for result in results.ResultsReader(job.results()):
print result
返回:
OrderedDict([('values(host)', ['host1', 'host2', ... 'hostN'])])
'hostN'
值是我想要存储在集合中的值。
我试过了:
actual_hosts = set()
for result in results.ResultsReader(job.results()):
actual_hosts.add(result)
返回:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: unhashable type: 'OrderedDict'
完成我在这里尝试的最佳方法是什么?对任何想法持开放态度。
答案 0 :(得分:1)
如果OrderedDict
中的每个值都是一个列表(如发布的示例中所示),则results.values()
是列表(或python3中的可迭代)列表。在这种情况下,您可以迭代地将它们添加到集合中:
actual_hosts = set()
for result in results.ResultsReader(job.results()):
for hosts in results.values():
actual_hosts.update(hosts)
如果每个值都是一个字符串,则不需要内部循环,您可以直接向该集添加results.values()
:
actual_hosts = set()
for result in results.ResultsReader(job.results()):
actual_hosts.update(results.values())
答案 1 :(得分:0)
result.values()
应该为您提供['host1',..
答案 2 :(得分:0)
根据dict
的值创建集合的示例(与OrderedDict
相同):
d = {
'a': [1, 2, 3],
'b': [2, 3, 4]
}
hosts = set().union(*d.itervalues())
# set([1, 2, 3, 4])
然后延伸到:
from itertools import chain
hosts = set().union(*chain.from_iterable(res.values() for res in results.ResultsReader(job.results())))
显式循环和更新虽然更好:)