我有一个结果列表,我需要从中提取各种其他列表。例如,所有车主都是男性,所有车辆都在5到10岁之间。
def get_male_owners(self):
results = []
for result in self.results:
if result.owner.sex.male:
results.append(result)
return results
def get_cars_5_to_10(self):
results = []
for result in self.results:
if result.car:
if self.is_5_to_10(result.car):
results.append(result)
return results
def is_5_to_10(self, car):
if car.age <= 10 and car.age >= 5:
return True
else:
return False
问题是我需要构建许多不同的列表,但每个列表构建函数中的许多代码都很常见。在这里以Pythonic方式实现DRY的最佳方法是什么?感谢。
答案 0 :(得分:3)
使用列表推导:
def get_male_owners(self):
return [res for res in self.results if res.owner.sex.male]
def get_cards_5_to_10(self):
return [res for res in self.results if res.car and self.is_5_to_10(res.car)]
def is_5_to_10(self, car):
return 5 <= car.age <= 10
如果你只需要一些可迭代的东西,你也可以通过用括号替换括号来返回生成器表达式。
是的,x <= y <= z
表达式在python中有效,它确实产生了正确的结果,而不是像(5 <= car.age) <= 10
那样。
答案 1 :(得分:1)
def filter(self, by=None):
return [res for res in self.results if by(res)]
def get_male_owners(self):
return self.filter(lambda res: res.owner.sex.male)