将OrderedDict值存储在Python中设置

时间:2014-03-07 16:18:14

标签: python python-2.7 set splunk ordereddictionary

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'

完成我在这里尝试的最佳方法是什么?对任何想法持开放态度。

3 个答案:

答案 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())))

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