Python 如何在列表中获取max对象并替换它?
我正在研究遗传算法,定义了一个类:Python 如何在列表中获取max对象并替换它?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在研究遗传算法,定义了一个类: class Solution: def __init__(self, N=1, K=1): self.wi = {} self.loss = 0 id = random.sample([i for i in range(N)], K) wi = [random.random() for _ in range(K)] for i in range(K):
class Solution:
def __init__(self, N=1, K=1):
self.wi = {}
self.loss = 0
id = random.sample([i for i in range(N)], K)
wi = [random.random() for _ in range(K)]
for i in range(K):
self.wi[id[i]] = wi[i]
生成了一个obj列表
population = [Solution(N, K) for _ in range(100)]
在我的算法中,将从population
列表中创建一个新的objC
,并用最大的损失替换population
中的obj
我试过了
largest = max(population, key = attrgetter('loss'))
largest = C
但是列表中的obj不会随着最大值的改变而改变,我该怎么做才能实现这一点呢?替换
from operator import attrgetter
largest = max(population, key = attrgetter('loss'))
largest = C
与
替换
from operator import attrgetter
largest = max(population, key = attrgetter('loss'))
largest = C
与
您可以计算最大索引,然后为该索引设置填充,而不是计算最大对象:
largest_i = max(range(len(population)),key=lambda i:population[i].loss)
这将只扫描列表一次。您可以计算最大索引,然后为该索引设置填充,而不是计算最大对象:
largest_i = max(range(len(population)),key=lambda i:population[i].loss)
这将只扫描列表一次。您希望max=C
更改列表吗?您需要找到索引,并在此基础上替换-population[index\u of\u max]=C
。与其继续查找max()
对象,为什么不将这些对象保留在排序列表中,或者更好的是,将a作为优先级队列?从列表中选择一个极端元素,同时添加另一个极端元素,这样做既简单又高效;对于heapq
您只需反转损失
值。非常简单,谢谢@jornsharpegrat的想法,非常感谢@Martijn Pieters♦您希望max=C
更改列表吗?您需要找到索引,并在此基础上替换-population[index\u of\u max]=C
。与其继续查找max()
对象,为什么不将这些对象保留在排序列表中,或者更好的是,将a作为优先级队列?从列表中选择一个极端元素,同时添加另一个极端元素,这样做既简单又高效;对于heapq
您只需反转损失
值。非常简单,谢谢@jornsharpegrat的想法,非常感谢@Martijn Pieters♦这需要扫描population
两次;一次找到最大的,一次找到它的索引。这在较大的总体上是低效的。index
方法是否按所有属性比较两个对象?像Solution.wi这样的dict
类型的属性的键和值如何?不比较地址value@QuentinLewes由于您尚未实现\uuuu eq\uuuu
,因此它将仅在对象标识上匹配这需要扫描总体
两次;一次找到最大的,一次找到它的索引。这在较大的总体上是低效的。index
方法是否按所有属性比较两个对象?像Solution.wi这样的dict
类型的属性的键和值如何?不比较地址value@QuentinLewes由于您尚未实现\uuuuuueq\uuuu
,因此它将仅在对象标识上匹配