使用列表理解的Pythonic方式

时间:2014-12-15 14:13:02

标签: python list-comprehension

我知道这段代码可以提高效率....

return_list = []
for attribute in attributes:
    if attribute['internalname'] in attributenames:
        attr = Attribute();
        attr.name = attribute['internalname']
        attr.value = attribute['value']
        return_list.append(attr);

return return_list

我可以轻松完成列表理解,但由于有一个对象创建attr=Attributes(),我不知道如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:2)

Attribute()将名称和值作为参数:

return [Attribute(attr['internalname'], attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

如果您需要支持各种属性,可以让它接受关键字参数:

return [Attribute(name=attr['internalname'], value=attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

如果两者都不是选项,请创建一个函数来创建具有Attributename属性的value对象:

def create_attribute(name, value):
    attr = Attribute()
    attr.name = name
    attr.value = value
    return attr

return [create_attribute(attr['internalname'], attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

答案 1 :(得分:1)

__init__是否有Attribute方法来获取命名参数?如果是这样,你可以做类似

的事情
return_list = [Attribute(name=attribute['internalname'], value=attribute['value']) for attribute in attributes if attribute['internalname'] in attributenames]

答案 2 :(得分:0)

这是一个评论,作为答案发布,因为评论系统不适合发布代码示例。使用列表推导有两个很好的答案,我想补充关于生成器和生成器表达式的讨论。

虽然列表理解比您的功能短,但也可能不太可读。另一种方法是使用发电机:

def make_attributes(attributes, attributenames):
    for attribute in attributes:
        if attribute['internalname'] in attributenames:
            attr = Attribute();
            attr.name = attribute['internalname']
            attr.value = attribute['value']
            yield attr

还有生成器表达式(使用这些代替列表推导,你不需要真正的列表,例如,当你只是迭代结果时):

# borrowing create_attribute from Martijn Pieters
return (
    create_attribute(attr['internalname'], attr['value'])
    for attr in attributes 
    if attr['internalname'] in attributenames
)