Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取对象的子集';属性作为Python字典?_Python_Python 2.7 - Fatal编程技术网

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

如何获取对象的子集';属性作为Python字典?,python,python-2.7,Python,Python 2.7,短版: 在Python中,有没有一种方法可以(干净/优雅地)说“给我一个对象的这5个(或多个)属性,而不是别的,作为一个字典” 较长版本: 使用Javascript下划线库,我可以将一组对象/字典(在JS中,它们是一样的)简化为它们属性的一组子集,如下所示: var subsets = _(someObjects).map(function(someObject) { _(someObject).pick(['a', 'd']); }); 如果我想对Python对象(而不是字典)执行相

短版:

在Python中,有没有一种方法可以(干净/优雅地)说“给我一个对象的这5个(或多个)属性,而不是别的,作为一个字典”

较长版本:

使用Javascript下划线库,我可以将一组对象/字典(在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实用程序可以比JS版本更干净(甚至更干净)地实现这一点?

这可以通过简单的组合来实现

当然,如果你想:

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

subsets = [pick("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]
>>> 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}]