按对象属性

时间:2016-12-22 19:04:37

标签: python

我有一个类Metric对象的词典。每个Metric对象都有一个名为category的属性(例如,“cat1”,“cat2”,...)。通过category排列字典最聪明的方法是什么?

我现在的解决方案是通过迭代每个对象来制作一组所有类别,然后再次迭代并将每个对象分配到一个类别,但我认为可能有更有效的方法?

我有什么:

{'a': <__main__.Metric at 0xb1e3470>,
 'b': <__main__.Metric at 0xb14f7b8>,
 'c': <__main__.Metric at 0xb160828>,
 'd': <__main__.Metric at 0x5ee9128>,
 'e': <__main__.Metric at 0xb14f550>,
 'f': <__main__.Metric at 0xb14ff98>,
 'g': <__main__.Metric at 0xb14fa58>,
...}

我想要的是什么:

{'cat1': [<__main__.Metric at 0xb160828>, ...]
 'cat2': [<__main__.Metric at 0xb14f550>, ...],
...}

3 个答案:

答案 0 :(得分:3)

你应该使用collections.defaultdict之类的:

from collections import defaultdict

my_dict = defaultdict(list)

for obj in your_dict.values():
    my_dict[obj.category].append(obj)
    #          ^ object category as key

其中your_dict是保存问题中提到的当前字典的结构

答案 1 :(得分:1)

这样的东西?

cat_dict = dict((obj.category, obj) for obj in metric_dict.itervalues())

答案 2 :(得分:0)

您可以执行以下操作:

category_dict = {}
for obj in metric_dict.values():
   cat = obj.category
   if cat not in category_dict:
     category_dict[cat] = []
   category_dict[cat].append(obj)

这应该为您提供一个包含指标列表的类别字典:

{ 'cat_1': [Metric, Metric, ...],
    'cat_2': [Metric, Metric, ...],
    ...
  }