【问题标题】:How to get a list of objects by maximum attribute value from N multi-list of objects?如何从 N 多对象列表中按最大属性值获取对象列表?
【发布时间】:2019-06-18 04:35:54
【问题描述】:

我有一个多对象列表如下(简化版)

listA = [[obj1(val=1),obj2(val=1)],[obj2(val=4),obj3(val=2)]]
listB = [[obj4(val=1),obj5(val=1)],[obj6(val=5),obj7(val=3)]]
listC = [[obj8(val=1),obj9(val=1)],[obj10(val=6),obj11(val=4)]]

我想通过比较每个多列表的子列表,从上述多列表中获取具有某个属性最大值的对象列表。如果所有比较对象的属性值都相同,则应该得到任何一个对象。

输出:

maxList = [obj1(value=1),obj10(val=6)]

有一个类似的question 从列表中获取属性最大值的对象,但这种情况是针对多列表的。我知道这可以通过嵌套的 for 循环来实现,但是必须有更好的方法来使用 itertools 和 getattr 来做到这一点?

【问题讨论】:

    标签: python-3.x list itertools getattribute


    【解决方案1】:

    为简化起见,让我们演示一下常规整数。使这种方法适应您的对象。

    给定

    import itertools as it
    
    
    a = [[1, 1], [3, 2]]
    b = [[1, 1], [5, 3]]
    c = [[1, 1], [6, 3]]
    

    代码

    list(map(max, [list(it.chain(*col)) for col in zip(a, b, c)]))
    # [1, 6]
    

    等价

    [max([x for x in it.chain(*col)]) for col in zip(a, b, c)]
    # [1, 6]
    

    【讨论】:

    • 谢谢,这很完美。您可以通过将所有多列表合并到一个大列表中来实现“N”多列表 - mylists=[a,b,c,...] 。然后将 zip(a,b,c) 替换为 zip(*mylists)。
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2022-09-29
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多