2017-01-04 8 views
3

を選ぶ:、私は他の人「サブリスト」で、各「サブリスト」を比較したいと思いますPythonの - 私はリストのリストを持っているリストのリストを比較し、最大値

l = [['a1', 2], ['a1', 3], ['a1', 1], ['b1', 4], ['b1', 2], ['b1', 6], ['c1', 2]] 

ものと一致インデックス[0]に同じ値を持っており、結果はこのようなものであるように、ただ、最大のインデックス[1]を持っているものを保つ:

resultingList = [['a1', 3], ['b1', 6], ['c1', 2]] 

すると、私はと条件文、ループのための様々なしようとしてきたが、私詰まってしまった。

誰かが私にこれを手渡して正しい軌道に乗せてくれますか?

+0

あなたの試みを示してください – depperm

+0

'itertools.groupby()'を見てください。 – DyZ

答えて

4

使用itertools.groupby

from itertools import groupby 
l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]] 
l = [max(g, key=lambda x: x[1]) for k, g in groupby(sorted(l), key=lambda x: x[0])] 
+1

lをソートする必要はなく、すでにソートされているようです。あなたがそれを並べ替えるならば、ラムダを渡す必要はありません。ここで自然なソートがうまく動作します(それはマイナーなものです) –

+0

@ Jean-FrançoisFabre私はそれをうかがいましたが、実際のデータがテストデータほど良く見えるという保証はありませんでした。私はあなたが「ラムダを渡す必要はありません」とはどういう意味なのか分かりません。 'groupby'のデフォルトの振る舞いは、アイデンティティを使ってキーを生成することであるので、' ['a1'、1] 'と' ['a1'、2] 'をグループ化することはできません。 –

+0

私は間違って読んだので、 'lambda'は' sorted'関数の中にあると思っていました。同意する。 –

1

全ての最大値を保持するために辞書を作成します。

L = [['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2], ...] 
d = {} 

for k,v in L: 
    d[k] = max(d.get(k, -float('inf'), v) 
2

ナチュラル答えは、itertools.groupbyを使用してサブリストの最初の要素でグループ化され、単にそれぞれにmaxを適用していますグループ。第1のグループ化された要素は同じであるので、maxは第2の要素に従って自然に最大値をとる:整数。

import itertools 

l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]] 

print([max(v) for _,v in itertools.groupby(l,lambda x : x[0])]) 

結果:

[['a1', 3], ['b1', 6], ['c1', 2]] 

注:リストは最初の要素の値に基づいてソートされていない場合は、sorted(l)ニーズはあなたがlambda式を置き換えることができl

0

の代わりに使用されます@ Patrick Haughの解答operator.itemgetterのように:

In [18]: from itertools import groupby 

In [19]: from operator import itemgetter 

In [20]: l = [['b1', 2], ['a1', 2], ['a1', 3], ['c1', 2], ['a1', 1], ['b1', 4], ['b1', 6]] 

In [21]: [max(g, key=itemgetter(1)) for _, g in groupby(sorted(l), itemgetter(0))] 
Out[21]: [['a1', 3], ['b1', 6], ['c1', 2]] 
関連する問題