写这个过滤列表理解的最具Python式的方法是什么?

2024-05-16 04:07:21 发布

您现在位置:Python中文网/ 问答频道 /正文

也许我起得太晚了。在

我有一个对象,它是字典的一个薄薄的包装。它将假装拥有字典中任何键的属性,如果引用了不存在的键,则返回None。在

我只想为三个可能的键返回唯一的“truthy”值。(不是没有)。对象可能没有一个或多个键。或者,它可能在两个或三个键中具有相同的值。在

这段代码可以满足我的要求:

set(getattr(obj, field) for field in ['field1', 'field2', 'field3'] if getattr(obj, field))

我只是不喜欢重复getattr()两次的样子。我觉得我忽略了一个更好的方法。在


Tags: 对象代码innoneobjfieldfor字典
3条回答

如果瘦包装返回默认值None

s = set(getattr(obj, field) for field in ['field1', 'field2', 'field3']) - {None}

另一种可能性是:

^{pr2}$

您可以在以后筛选出None值:

set(filter(bool, [getattr(obj, field) for field in ['field1', 'field2', 'field3']]))

或者你可以忘了这个东西。我可能会这样做:

^{pr2}$

另一种使用getattr默认值的方法:

set(x for x in getattr(obj, field, None) for field in ['field1', 'field2', 'field3'] if x)

编辑:

这里要向你展示这个功能背后的逻辑,以及为什么我认为它可能比其他一些解决方案更好(我可能错了,但是嘿,生活就是要从错误中学习)

^{pr2}$

如您所见,只有1个循环,并且对每个字段只调用一次getattr()。只有“真实”的值被添加到结果中。我认为这比获得所有结果,然后在以后删除“非真实”值更有效。但是如果我错了请纠正我。干杯。在

相关问题 更多 >