重构这个列表构建代码的最Pythonic方法是什么?

时间:2011-01-29 09:16:33

标签: dry python

我有一个结果列表,我需要从中提取各种其他列表。例如,所有车主都是男性,所有车辆都在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的最佳方法是什么?感谢。

2 个答案:

答案 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)