我知道这段代码可以提高效率....
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>
答案 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]
如果两者都不是选项,请创建一个函数来创建具有Attribute
和name
属性的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
)