如何以更pythonic的方式编写defaultdict?

时间:2015-04-08 12:11:07

标签: python defaultdict

我如何用Pythonic方式写这个: counts_to_display是一个defaultdict(dict),它包含以下数据:

defaultdict(<type 'dict'>,
            {'server01': {'metric1': 9},
             'server02': {'metric1': 12},
             'server03': {'metric3': 8}, 
             'server04': {'metric1': 11, 'metric2': 7}
            })



headers = []
for count in counts_to_display:
        for name in counts_to_display[count]:
                if name not in headers:
                        headers.append(name)

我需要在表格中打印所有内容:

Server   Metric1 Metric2 Metric3
server01    9       0       0
server02    12       0       0
server03    0       0       8
server04    11       7       0

4 个答案:

答案 0 :(得分:0)

这是一个解决方案:

headers = {key for count in counts_to_display.values() for key in count}

我使用的是集合而不是列表,因为我们正在使用字典作为输入,无论如何都有任意排序,所以想要保持完整的排序是没有意义的,并设置自动为我们处理重复数据删除,同时也为某些操作提供更高的性能。

您也可以使用以下内容:

import itertools
headers = set(itertools.chain.from_iterable(counts_to_display.values()))

答案 1 :(得分:0)

您可以使用list comprehensionreduce来完成工作

headers = set(reduce(lambda x,y : x+y, [count_to_display[count].keys() for count in count_to_display]))

答案 2 :(得分:0)

reduce怎么样?应该是最快的解决方案之一。

print sorted(reduce(lambda x, y: x.update(y) or x, servers.itervalues()).keys())

答案 3 :(得分:0)

或者像这样:

>>> d = {'server01': {'metric1': 9},
         'server02': {'metric1': 12},
         'server03': {'metric3': 8}, 
         'server04': {'metric1': 11, 'metric2': 7}
        }
>>> dicts = [x for x in d.values()]
>>> result = reduce(lambda d, src: d.update(src) or d, dicts, {})
>>> result
{'metric3': 8, 'metric2': 7, 'metric1': 11}
>>> res = [r for r in result.keys()]
>>> res
['metric3', 'metric2', 'metric1']