首页 > 解决方案 > 如何比较python中列表列表中的项目

问题描述

我是 python 的新手,只是在做项目时学习东西,在这里我有一个列表列表,我需要在第二列和最后一列之间进行比较,并获取距离最大的列表的输出。此外,我正在复制一个列表。如果有人可以帮助我在 ag 中的单个列表列表中执行此操作,那将非常有帮助。提前致谢

如果这是一个输入,那么输出应该是,

ag = [['chr12','XX',1,5,4],
     ['chr12','XX',2,5,3],
     ['chr13','ZZ',6,10,4],
     ['chr13','ZZ',8,9,1],
     ['ch14','YY',12,15,3],['ch14','YY',12,15,3]]

EXPECTED OUTPUT:

     ['chr12','XX',1,5,4]
     ['chr13','ZZ',6,10,4]
     ['ch14','YY',12,15,3]

#However I tried of replicating the list like
#INPUT
ag = 
 [['chr12','XX',1,5,4],
 ['chr12','XX',2,5,3],
 ['chr13','ZZ',6,10,4],
 ['chr13','ZZ',8,9,1],
 ['ch14','YY',12,15,3],
 ['ch14','YY',12,15,3]]
 bg = 
 [['chr12','XX',1,5,4],
 ['chr12','XX',2,5,3],
 ['chr13','ZZ',6,10,4],
 ['chr13','ZZ',8,9,1],
 ['ch14','YY',12,15,3],
 ['ch14','YY',12,15,3]]


#The code which I tried was

c= []
for i in ag:
 for j in bg:
    if i[0]==j[0] and i[1]==j[1] and i[4]>j[4]:
        c.append(i)


the output which i get is
[['chr12', 'XX', 1, 5, 4], ['chr13', 'ZZ', 6, 10, 4]]

标签: python

解决方案


简而言之:要比较列表的可迭代(例如列表)中的项目,请使用keymax/min 函数的关键字 agument。它接受一个函数或 lambda 表达式,并在给key定每个值时将给定值与函数的结果进行比较。


假设您真正想要的是减少列表列表,以便条目的第二个元素是唯一的,并且您希望最后一个元素确定在冗余第二个值的情况下保留哪个条目:

如果迭代有任何问题,itertools有答案。在这种情况下,我们只需要带有关键字参数的groupby方法和标准 Python 的maxkey方法。

from itertools import groupby

def filter(matrix):
    filtered = [] # create a result list to hold the rows (lists) we want
    for key, rows in groupby(matrix, lambda row: row[1]): # get the rows grouped by their 2nd element and iterate over that
        filtered.append(max(rows, key=lambda row: row[-1])) # add the line that among its group has the largest last value to our result
    return filtered # return the result

我们可以将其压缩到单个生成器表达式或列表推导中,但对于初学者来说,上面的代码应该足够复杂。

请务必遵循 Stack Overflow 的未来问题指南,以防止评分低,并确保及时和高质量的答案。


推荐阅读