【问题标题】:Return the object with the max instance variable value返回具有最大实例变量值的对象
【发布时间】:2013-11-26 05:02:50
【问题描述】:

我有以下课程:

class Node(object):
def __init__(self, id):
    self.stat = 1
    self.children = set()
    self.id= = id

有一个包含此类实例的列表

list = [instance_0, instance_1, instance_2]

我希望我的代码返回在其self.stat 变量中具有最高值的对象

这是怎么做到的?

【问题讨论】:

    标签: list oop object list-comprehension


    【解决方案1】:

    首先,我建议不要使用list 作为变量名...我们将其命名为mylist

    所以你有:

    mylist = [ instance_0, instance_1, instance_2 ]
    

    那么这应该会给你另一个列表中的stat 变量:

    objstats = [ x.stat for x in mylist ]
    

    然后你可以申请max()找到最大的,index()找到它在哪个位置:

    maxindex = objstats.index(max(objstats))
    

    然后使用该索引找到您的原始对象:

    largest = mylist[maxindex]
    

    你当然可以合并最后两行:

    largest = mylist[objstats.index(max(objstats))]
    

    从技术上讲,您可以将整个数据组合成一行,但由于您引用了两次 objstats,因此存储它比计算两次更有效。

    【讨论】:

    • 感谢您的评论。确定 list 是一个内部关键字,所以使用 is 是不明智的。也非常感谢其余的答案,特别是评论每个步骤的作用。它对像我这样的新手程序员有很大帮助:)
    • 有趣的是,当我运行max(mylist) 时,我得到了相同的结果,但不确定它有多正确
    • @WolfgangKuehne 我必须稍作修改才能确定,但​​我怀疑当您执行max(mylist) 时,它会在添加到每个Node 的第一个元素上执行max(),这很方便在这种情况下是您想要的 - 如果您想要 max() 而不是其他成员,您必须采取不同的方法(如上)。也不确定这是否是故意行为(即是否需要 max() 这样做?)还是幸运的副作用......
    • 正如你所说,这是一个幸运的副作用。例如,如果我们在包含字符串的列表上运行max(),它会返回以字母表中最远的字符开头的字符串。为了扩展我的问题,我希望能够处理当 2 个(或更多实例)在其 s 变量中保存相等值并且该值最大时的情况。在这种情况下,我想返回包含s 中最大值的对象列表。这可行吗?
    • 不确定这是不是最好的方法,但像 m=max(objstats); list_of_largest = [z for z in mylist if z.stat == m] 这样的方法是实现这一目标的一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2015-06-23
    • 2019-08-07
    相关资源
    最近更新 更多