2011-01-29 48 views
0

我有一个结果列表,我需要从中提取各种其他列表。例如,所有车主都是男性,都是5到10岁的车。什么是重构此列表构建代码的最重要的Pythonic方法?

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

没有“最pythonic”的方式。有Pythonic的方式,是的,但除了极其简单的情况外,不是“最pythonic”。例如,列表解析通常被视为Pythonic(在这种情况下),但有时可能太复杂,无法读取,从而使它们变得不合理。 :) – 2011-01-29 10:09:33

回答

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

+0

一个小点,不应该结果变量res? – Ambrosio 2011-01-29 09:54:18

+0

已修复。 (并且这个最小注释长度很糟糕) – ThiefMaster 2011-01-29 10:00:56

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)