完整的代码来自DEAP包的示例:
https://github.com/DEAP/deap/blob/0ef6c40b4ba24dbbf1591bd97b08857a1fe3376a/examples/ga/onemax.pyHere
我做了一个测试,人口和个人的大小都是5,我输入以下语句:
>>>MAX=max(pop,key=attrgetter("fitness"))
>>>[1,1,1,1,1]
我理解这返回了pop.fitness的最大值,但是,为什么我不能直接将其称为:
>>>pop.fitness
并发生错误:
Traceback (most recent call last):
File "<ipython-input-74-b9dde7c090eb>", line 1, in <module>
pop.fitness
AttributeError: 'list' object has no attribute 'fitness'
为什么无法调用pop.fitness
?
答案 0 :(得分:0)
pop
是list
/ iterable。列表本身没有属性fitness
。该列表包含每个都具有属性fitness
的对象。 attrgetter('fitness')
创建一个函数,该函数在使用对象调用时返回该对象的fitness
属性。 max
使用此函数从列表中获取它应该排序的值。
我不知道您的列表中包含的内容是什么,但它是这样的:
>>> pop
[Thing(fitness=1), Thing(fitness=2), ...]
这两个是等价的:
>>> pop[0].fitness
1
>>> attrgetter('fitness')(pop[0])
1
max(pop, key=attrgetter('fitness'))
正在采取以下措施:
for thing in pop:
thing.fitness # here be magic using this property as sorting criterion