2014-02-27 30 views
2

我有一個列表a = [('b',1),('k',3),('g',2),('p',3) ...] 第一個元組是字母,第二個元素是字母發生頻率的計數。我試圖找到一個字母的最大出現次數(可以有多個,即k = 3和p = 3),並返回最接近'a'的字母。查找複雜列表中的最大值 - Python

我現在的邏輯是:找到最高的計數 - >創建另一個列表,只追加具有第二個元組=最高計數 - 排序列表 - 返回第一個元素的第一個元組。

如果有更好的方法來做到這一點在Python(我相信有),我都耳朵!

但無論哪種方式,在Python中找到最高計數的最有效方法是什麼?

目前我正在使用下面的方法,但它返回的是一個不是數字的列表元素。

max(a, key=operator.itemgetter(1))

+0

哦,如果你還打算使用這個,你可以假設「不同的方法來回答一個'只是一個字符串。即a ='kasdf asdlkj asdlkj fsdd' – Mazzone

+0

'max(a,key = operator.itemgetter(1))[1]'將返回數字... – isedev

+2

爲什麼不使用計數器呢? – njzk2

回答

4

只是排序與主要作爲2元組逆轉計數和焦炭列表:

>>> a = [('b', 1), ('k',3), ('g',2), ('p',3)] 
>>> sorted(a, key=lambda t:(-t[1], t[0])) 
[('k', 3), ('p', 3), ('g', 2), ('b', 1)] 

或使用min具有相同的密鑰:

>>> min(a, key=lambda t:(-t[1],t[0])) 
('k', 3) 
+0

只是打敗了我。 – njzk2

+2

我真的不喜歡代碼只有答案,沒有解釋什麼這樣的。 – amit

+0

當尋找最大值時,它似乎也是一種矯枉過正的行爲。 – amit

0

既然你有時會說你只需要計數,我們先做這個,因爲它是最簡單和最快的,使用一個生成器表達式:

a = [('b', 1), ('k',3), ('g',2), ('p',3)] 
max_count = max(count for (letter, count) in a) 
print max_count 

==>3

如果你真的關心的字母,或在一般情況下,關心的元組的元素不止一個?

Python通過第一個元素對元組進行排序(或比較),然後如果第一個元素相等,則由第二個元素等等。您需要具有最高計數和最早(最低)字符串的元組。您可以使用key =功能在MAX(),MIN()或排序()來給你想通過排序或通過比較,你可能會認爲是的

(count, backwards-sorting-letter??) 

最大除非有事情,並不是簡單的方法來創建一個字符串,從給定的字符串中排序相反的方式。但是,而不是你尋找最小值的最大值:

(-count, letter) 

這是ndpu做的。您需要一個功能將(letter, count)轉換爲(-count, letter)。換句話說,將a_tuple轉換爲(-a_tuple[1], a_tuple[0])

你可以做,像

def the_order_I_want(a_tuple): 
    return (-a_tuple[1], a_tuple[0]) 

print min(a, key=the_order_I_want) 

=>('k', 3)

或者你可以使用lambda表達式,這僅僅是一個縮短的方式來寫立即返回一些功能:

print min(a, key=lambda a_tuple: (-a_tuple[1], a_tuple[0])) 

=>('k', 3)

S Ø現在你有獲勝的元組,但如果你想通過自己的個性化......

result_tuple = min(a, key=lambda t: (-t[1], t[0])) 
count = result_tuple[1] 

letter, count = min(a, key=lambda t: (-t[1], t[0]))