2017-06-12 18 views
0

を使用して内側のリストの0番目の要素を格納することはできませんよ、私は以下のようにネストされたリストを持っている:私は、ネストされたリストでフィルタ機能を使用しようとしていますが、私はフィルタ機能

students = [['Jagan', 65.5], ['Kiran', 55.45], ['Maddy', 47.2], ['Harsha', 75.0], ['Pavy', 55.45]] 

私はの名前をフィルタリングするために、以下のようにラムダ関数を使用しています

def second_lowest(l): 
small, second_small = float('inf'), float('inf') 
for number in l: 
    if number[1] <= small: 
     small, second_small = number[1], small 
    elif number[1] < second_small: 
     second_small = number[1] 
return second_small 

れた後、私は第一、第二の最低数を調べるには、以下の機能を使用していたために二番目に低い得点を把握しようとしています2番目に低いスコアラー、

sl = second_lowest(students) 
names = filter(lambda x: x[0] if (x[1] == sl) else None, students) 
print names 

私はXを使用していますように、出力は名前だけでなければなりません期待してい[0]の式ではなく、以下のように私は、全体のリストを取得しています:

[['Kiran', 55.45], ['Pavy', 55.45]] 
+0

で埋めるリストを取得します。その戻り値は、元のシーケンスのどの要素がフィルタを通過するかを決定します。基本的にはTrueまたはFalseを返すべきですが、空でない文字列とNoneのような真理値があります。結果の上にたとえば 'itemgetter(0)'をマップするか、フィルタリングの後にリストの理解を使用する必要があります。 –

+0

カスタムO(n)関数の代わりにO(nlogn)ソートを使用しない特別な理由はありますか? –

答えて

1

フィルタ()関数はビットの作品異なる、それは各項目のTrueまたはFalseを返す必要があり、唯一の真の一つは出力になりますので、あなたは、このような方法でそれをしなければならない。

names = filter(lambda x: x[1] == sl, students) 

あなたはそれを介して別のラムダを使用する必要があります名前だけを取得するには

names = map(labmda x: x[0], filter(lambda x: x[1] == sl, students)) 

またはちょうど1マップ()の代わりに、フィルタの()が、その場合には、あなたがフィルタに渡された関数が述語であるなしの

names = map(lambda x: x[0] if (x[1] == sl) else None, students) 
+0

リストの理解度を使ってください: 'names = [n = s1ならば(n、s)の学生のためのn]、特に以下のようになります。 'map'と' filter'はPython 3では動作が異なります。 –

関連する問題