根据 python 中其他列表的值获取最大子列表
getting max sublist based on value from other list in 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 个完整子列表,它在第二个索引位置具有最大值。
输出应该是
flist=[['RD-2', 'c', 127],['RD-3', 'b', 140],['RD-5', 'a', 120]]
帮助我。
试试这个:
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]]
更紧凑一些,但使用列表理解的结果相同:
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]]
下面是使用列表理解的方法:
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]]
我会先将最大列表存储在字典中,然后稍后引用该字典来构建新列表:
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]]
想要根据条件获取在指定索引上具有最大值的子列表。
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]]
帮助我。
试试这个:
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]]
更紧凑一些,但使用列表理解的结果相同:
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]]
下面是使用列表理解的方法:
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]]
我会先将最大列表存储在字典中,然后稍后引用该字典来构建新列表:
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]]