получение максимального подсписка на основе значения из другого списка в python

хотите получить подсписок, который имеет максимальное значение по указанному индексу на основе условия.

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 полный подсписок из основного списка, который имеет максимальное значение во 2-й позиции индекса. вывод должен быть

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

Помоги мне.


person learningstudent    schedule 02.01.2019    source источник
comment
Интересная проблема. Вы пробовали что-нибудь?   -  person meowgoesthedog    schedule 02.01.2019
comment
@meowgoesthedog: попытался использовать цикл for из базового списка, но не смог применить логику к основному списку, чтобы получить максимальный подсписок.   -  person learningstudent    schedule 02.01.2019
comment
Здорово, что вы уже что-то попробовали! Если вы можете показать нам, что вы пробовали, и ошибку, которую вы получили, мы сможем лучше понять и помочь вам.   -  person CodeIt    schedule 02.01.2019


Ответы (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]]
person Mehrdad Pedramfar    schedule 02.01.2019
comment
приветствую вас @learningstudent, обратите внимание на это: stackoverflow.com/help/someone-answers - person Mehrdad Pedramfar; 02.01.2019

Немного более компактно, но с тем же результатом, используя понимание списка:

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]]
person Schorsch    schedule 02.01.2019

Вот способ использования понимания списка:

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]]
person yatu    schedule 02.01.2019

Я бы сначала сохранил максимальные списки в словаре, а затем просто сослался на этот словарь, чтобы создать новый список:

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]]
person RoadRunner    schedule 02.01.2019