0

Python Splunk SDK中,ResultsReader 对象提供了一个可迭代对象,该对象在访问时返回一个 OrderedDict。我想将该 OrderedDict 中包含的值存储到一个集合中,以便对期望值列表执行集合减法。我很难找到一种方法来访问 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'

完成我在这里尝试的最佳方法是什么?接受任何想法。

4

3 回答 3

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())
于 2014-03-07T16:28:43.887 回答
0

result.values()应该给你的部分['host1',..

于 2014-03-07T16:26:23.910 回答
0

从 a 的值创建集合的示例dict(与 a 相同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())))

显式循环和更新虽然更好:)

于 2014-03-07T16:29:52.000 回答