Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中获取max对象并替换它?_Python_Python 2.7_Python 3.x - Fatal编程技术网

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
列表中创建一个新的obj
C
,并用最大的
损失替换
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
,因此它将仅在对象标识上匹配