在Python中将OrderedDict值存储到集合中

0 投票
3 回答
1851 浏览
提问于 2025-04-17 21:19

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

撰写回答