返される順序が重要でない場合は、groupby
fromitertools
を使用してアイテムを最初の要素でグループ化し(最初の要素で並べ替えた後)、max
関数を使用して最大値を引き出すことができます(また、これはその場で変更するのではなく、新しいリスト):
In [1]: from itertools import groupby
In [2]: l = [[['a'],[24],214,1] ,[['b'],[24],312,1] ,[['a'],[24],3124,1] , [['c'],[24],34,1]]
In [3]: result = []
In [4]: for k, g in groupby(sorted(l, key=lambda x: x[0]), key=lambda x: x[0]):
...: result.append(max(g, key=lambda m: m[2]))
...:
...:
In [5]: result
Out[5]: [[['a'], [24], 3124, 1], [['b'], [24], 312, 1], [['c'], [24], 34, 1]]
これを少し拡張して、元の順序を維持したい場合は、にあるl
アイテムのみを含めることで変更できますresults
。これにより、順序が維持されます。
In [6]: l = [i for i in l if i in result]
In [7]: l
Out[7]: [[['b'], [24], 312, 1], [['a'], [24], 3124, 1], [['c'], [24], 34, 1]]
そして、それをワンライナーの真の忌まわしきものに組み合わせるために、あなたはこれを行うことができます(しかしおそらくそうすべきではありません:)):
In [10]: l = [[['a'],[24],214,1] ,[['b'],[24],312,1] ,[['a'],[24],3124,1] , [['c'],[24],34,1]]
In [11]: [i for i in l if i in [max(g, key=lambda m: m[2]) for k, g in groupby(sorted(l, key=lambda x: x[0]), key=lambda x: x[0])]]
Out[11]: [[['b'], [24], 312, 1], [['a'], [24], 3124, 1], [['c'], [24], 34, 1]]