1

精简版:

在 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 实用程序可以用来做这件事,比 JS 更干净(甚至更干净)版本?

4

2 回答 2

3

这可以简单地通过将列表推导与字典推导相结合来完成。

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]
于 2013-01-03T01:02:35.363 回答
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}]
于 2020-07-15T14:27:26.157 回答