【问题标题】:getting max sublist based on value from other list in python根据python中其他列表的值获取最大子列表
【发布时间】:2019-05-29 04:40:41
【问题描述】:

想要根据条件获取在指定索引上具有最大值的子列表。

mainlist=[[['RD-2', 'a', 120], ['RD-2', 'b', 125], ['RD-2', 'c', 127]], [['RD-3', 'a', 120], ['RD-3', 'b', 140]], [['RD-5', 'a', 120]],[['RD-7', 'a', 122]]]

还有另一个列表

baselist=[['RD-2', 100],['RD-3', 200],['RD-5', 240]]

对于基本列表中的每个第一个子元素,我需要主列表中的 1 个完整子列表,该子列表在第二个索引位置具有最大值。 输出应该是

flist=[['RD-2', 'c', 127],['RD-3', 'b', 140],['RD-5', 'a', 120]]

帮帮我。

【问题讨论】:

  • 有趣的问题。你试过什么吗?
  • @meowgoesthedog:尝试使用 baselist 中的 forloop,但无法将逻辑应用于主列表以获取最大子列表。
  • 很高兴您已经尝试了一些东西!如果您可以向我们展示您的尝试以及遇到的错误,我们可以更好地理解和帮助您。

标签: python python-2.7 list nested-lists


【解决方案1】:

我会先将最大列表存储在字典中,然后稍后再引用该字典来构建新列表:

from operator import itemgetter

mainlist = [
    [["RD-2", "a", 120], ["RD-2", "b", 125], ["RD-2", "c", 127]],
    [["RD-3", "a", 120], ["RD-3", "b", 140]],
    [["RD-5", "a", 120]],
    [["RD-7", "a", 122]],
]

baselist = [["RD-2", 100], ["RD-3", 200], ["RD-5", 240]]

d = {}
for sublist in mainlist:
    k = sublist[0][0]
    d[k] = max(sublist, key=itemgetter(2))

flist = [d.get(k) for k, _ in baselist]

print(flist)
# [['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]

【讨论】:

    【解决方案2】:

    这是一种使用列表推导式的方法:

    base = list(zip(*baselist))[0]
    [max(i, key=lambda x:x[2]) for i in mainlist if i[0][0] in base]
    [['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]
    

    【讨论】:

      【解决方案3】:

      更紧凑,但使用列表推导得到相同的结果:

      max_entries = [max(x, key=lambda x:x[2]) for x in mainlist]
      flist = [max_entry for max_entry in max_entries for base_entry in baselist if max_entry[0]==base_entry[0]]
      

      【讨论】:

        【解决方案4】:

        试试这个:

        flist = []               
        for item in baselist: 
             for i in mainlist:       
                 if i[0][0] ==item[0]:               
                     flist.append(max(i, key=lambda x:x[2]))
        

        flist 将是:

        [['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]
        

        您也可以使用itertools.product 来简化for 循环:

        from itertools import product    
        
        flist = []               
        for i, item in product(mainlist,baselist):      
             if i[0][0] ==item[0]:               
                  flist.append(max(i, key=lambda x:x[2]))
        

        或者也只有一行:

        flist = [max(i, key=lambda x:x[2]) for i, item in product(mainlist,baselist) if i[0][0] == item[0]]
        

        【讨论】:

        猜你喜欢
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 2021-09-27
        • 1970-01-01
        • 2022-11-11
        相关资源
        最近更新 更多