2017-06-12 52 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 

在這之後我使用如下lambda函數過濾掉名稱第二低的得分手,

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(nlogn)排序而不是自定義的O(n)函數? (當然,這可能是非常好的原因,但也許這只是不必要的微觀優化。) –

回答

1

的過濾器()函數的工作原理有點不同的,它應該返回真或假的每一個項目,只有真正的人會在輸出中,所以你必須做一個這樣的方式:

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

得到的只有名字,你應該使用另一個lambda在它

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

或只是一個地圖(),而不是過濾器(),但在這種情況下,你會得到一個列表填充無的

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

或者使用列表解析:'names = [n for(n,s)in students if s == s1]',尤其是在Python 3中'map'和'filter'的行爲會有所不同。 –