在Python中将OrderedDict值存储到集合中
在Python Splunk SDK中,ResultsReader对象提供了一种可迭代的对象,当你访问它时会返回一个有序字典(OrderedDict)。我想把这个有序字典里的值存到一个集合(set)里,以便能和一组预期值进行集合减法运算。但是我找不到合适的方法来访问这个有序字典里的值,以便把它们存到集合中。
代码示例:
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
result.values()
这个命令会让你得到一部分内容,像是 ['host1',..
这样的列表。
0
下面是一个从字典(dict
)的值创建集合(set)的例子(对于有序字典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())))
不过,明确的循环和更新看起来更好一些哦 :)
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())