2013-03-01 29 views
1

我正在研究遗传算法问题。假设我有一个Population()类,它有一个Individual()的列表。每个人都有一个与它相关的分数。根据他们在人群中的分数对这些个人进行排序/排序的好方法是什么?作为一个例子:通过成员的属性排序

class Individual(object): 
    rr = 100 
    def __init__(self): 
     self.score = random.randrange(self.rr) 

class Population(object): 
    def __init__(self, size): 
     self.size = size 
     self.population = [Individual() for _ in xrange(self.size)] 

pop = Population(5) 
for i in xrange(pop.size): 
    print pop.population[i].score 

是否有Pythonic的方式来排序这些个人的得分?谢谢!

回答

3

当然,使用key参数为.sort()方法:

from operator import attrgetter 
pop.population.sort(key=attrgetter('score')) 

使用operator.attrgetter()使这是一个更容易一些,但不是必需的。

请参阅Python wiki上的Sorting Howto以获取更多提示和技巧。

+0

......华丽! – Rock 2013-03-01 22:13:25

+0

应该得到'分数',而不是'rr',但是很好的答案。 – mVChr 2013-03-01 22:20:02

+0

@mVChr:确实,已更正。谢谢。使用cmp函数的 – 2013-03-01 22:24:20

1
sorted_pop = sorted(pop.population, lambda x, y: cmp(x.score, y.score)) 
+1

做了更多的工作,并且该选项已从Python 3中移除(尽管存在[解决方法](http://docs.python.org/3/library/functools.html#functools.cmp_to_key)) 。 – 2013-03-01 22:16:22

+0

@MartijnPieters很高兴知道,谢谢。 – mVChr 2013-03-01 22:18:53

0

没有导入任何库:

pop.population.sort(key=lambda x: x.score) 
相关问题