Python dict理解从对象

时间:2016-03-27 15:20:00

标签: python

给出这样的设置:

class Foo():
   state = 'x'
   amount = 1


a = Foo()
b = Foo()
c = Foo()
c.state = 'y'
foos = [a, b, c]

我想获得一个密钥= object.state,值= sum(object.amounts of objects with that state)的字典。在这种情况下:

{'x': 2, 'y': 1}

我想自动执行此操作,因此我不需要事先了解不同的可能状态。

当然,我可以用这样无聊的方式迭代:

my_dict = {}
for foo in foos:
    try:
        my_dict[foo.state] += foo.value
    except (KeyError, TypeError):
        my_dict[foo.state] = foo.value 

但这有点冗长,我想知道是否有更好的方法可以做到这一点,也许是用词典理解或其他方式,但到目前为止我的努力都是徒劳的。

3 个答案:

答案 0 :(得分:3)

Counter

怎么样?
>>> from collections import Counter
>>>
>>> foos = [a,b,c]
>>> 
>>> c = Counter()
>>> for x in foos:
        c[x.state] += x.amount


>>> c
Counter({'x': 2, 'y': 1})

答案 1 :(得分:2)

在这种情况下,词典理解不是最优化的方法。相反,您可以使用collections.defaultdict(),如下所示:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> 
>>> for obj in foos:
...     d[obj.state] += obj.amount
... 
>>> d
defaultdict(<type 'int'>, {'y': 1, 'x': 2})

答案 2 :(得分:1)

您可以使用defaultdict。

from collections import defaultdict
my_dict = defaultdict(lambda: 0)
for foo in foos:
    my_dict[foo.type] += foo.value

您也可以使用setdefault。

my_dict = {}
for foo in foos:
    my_dict.setdefault(foo.type, 0)
    my_dict[foo.type] += foo.value