如何获取对象属性的子集作为Python字典?

时间:2013-01-03 00:54:15

标签: python python-2.7

简短版本:

在Python中有一种方法(干净/优雅地)说“给我一个对象的这5个(或多个)属性,而不是其他任何东西,作为字典”?

版本更长:

使用Javascript Underscore库,我可以将一堆对象/字典(在JS中它们是相同的东西)减少到它们的属性的一堆子集,如下所示:

var subsets = _(someObjects).map(function(someObject) {
    _(someObject).pick(['a', 'd']);
});

如果我想用Python对象(不是字典)做同样的事情,但似乎我能做的最好就是使用列表理解并手动设置每个属性:

subsets = [{"a": x.a, "d": x.d} for x in someObjects]

当只有两个属性时它看起来并不那么糟糕,并且它们都是一个字母,但如果我开始拥有更多/更长的属性,它会变得更加丑陋(而且每当我写一个多行列表时我感觉不对理解)。我可以将整个事情转换为使用for循环的函数,但在我这样做之前,是否有任何很酷的内置Python实用程序,我可以用它来干净利落(甚至更干净)版本

2 个答案:

答案 0 :(得分:2)

这可以通过组合a list comprehension with a dictionary comprehension来完成。

subsets = [{attr: getattr(x, attr) for attr in ["a", "d"]} 
           for x in someObjects]

当然,如果您愿意,可以提炼出理解力:

def pick(*attrs):
    return {attr: getattr(x, attr) for attr in attrs} 

subsets = [pick("a", "d") for x in someObjects]

答案 1 :(得分:0)

>>> A = ['a', 'c']
>>> O = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33, 'd': 44}]

>>> [{a: o[a] for a in A} for o in O]
[{'a': 1, 'c': 3}, {'a': 11, 'c': 33}]

>>> list(map(lambda o: {a: o[a] for a in A}, O))
[{'a': 1, 'c': 3}, {'a': 11, 'c': 33}]