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

How to write defaultdict in more pythonic way?

如何以 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)

我需要在 table:

中打印所有内容
Server   Metric1 Metric2 Metric3
server01    9       0       0
server02    12       0       0
server03    0       0       8
server04    11       7       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()))

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

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

reduce呢?应该是最快的解决方案之一。

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

或者像这样:

>>> 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']