如何根据条件删除嵌套列表的元素?

2024-06-16 13:57:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,如下所示:

l =[
   ['abgegeben', 'abgegeb', 339],
   ['abgegebene', 'abgegeb', 46], 
   ['abgegebenen', 'abgegeb', 30], 
   ['abgegebenes', 'abgegeb', 4],
   ['abgefahren', 'abgefahr', 58], 
   ['abgefahrene', 'abgefahr', 4],   
   ['abgefahrenen', 'abgefahr', 4], 
   ['abgefahrener', 'abgefahr', 4]
   ]

如您所见,子列表的第二个条目是第一个条目的词干。 由于茎是相同的,我想保留茎的子列表中有最高计数(339和58),并删除其他的如下:

l =[
   ['abgegeben', 'abgegeb', 339],
   ['abgefahren', 'abgefahr', 58]
   ]

我的列表包含数万个子列表。 我已经尝试用max函数比较条目,并将结果附加到一个新列表中,但没有成功

我怎样才能解决这个问题


Tags: 目的列表条目计数词干abgefahrenenabgefahreneabgegeb
2条回答

或使用itertools.groupby

print([max(l, key=lambda x: x[-1]) for _, l in groupby(l, key=lambda x: x[1])])

输出:

[['abgegeben', 'abgegeb', 339], ['abgefahren', 'abgefahr', 58]]

IIUC,使用itertools.groupby

from itertools import groupby

f = lambda x:x[1]
[max(g, key=lambda x: x[-1]) for k, g in groupby(sorted(l, key=f), key=f)]

注意:如果您确定第二个条目已排序,则可以跳过sorted

输出:

[['abgefahren', 'abgefahr', 58], 
 ['abgegeben', 'abgegeb', 339]]

最内部的解释:

  1. sorted(l, key=f):根据fl进行排序,即使用l中每个子列表的第二个条目。这是因为itertools.groupby无法处理未排序的列表(尽管具有相同的键,但它会生成单独的组)

  2. groupby(sorted(l, key=f), key=f):然后使用与sorted相同的键对排序的子列表进行分组。因此,与其两次使用相同的lambda,不如使用单键函数f

  3. [max(g, key=lambda x:x[-1]) ...]:最后max返回由groupby创建的组中的最大子列表。这一次,最大值是使用子列表的最后一个元素计算的,因此使用了新的lambda

相关问题 更多 >