在复杂列表中查找最大值 - Python

时间:2014-02-27 17:09:31

标签: python list mapping

我有一个列表a = [('b',1),('k',3),('g',2),('p',3)...] 第一个元组是一个字母,第二个元组是字母发生的频率。我试图找到一个字母的最大出现次数(可以有多个,即k = 3和p = 3)并返回最接近'a'的字母。

我目前的逻辑是:找到最高数量 - >制作另一个列表,只追加第二元组=最高计数的元素 - >对列表进行排序 - >返回第一个元素的第一个元组。

如果有更好的方法在Python中做到这一点(我确信有),我全都耳朵!

但无论如何,在Python中找到最高计数的最有效方法是什么?

目前我使用的是以下方法,但它返回的是列表元素而不是数字。

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

由于您有时会说您只想要计数,所以我们首先要做,因为它是最简单和最快的,使用生成器表达式:

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

==> 3

如果你真的关心这些字母,或者一般来说,关心元组中不止一个元素怎么办?

Python通过第一个元素对元组进行排序(或比较),然后如果第一个元素相等,则按第二个元素排序(或比较),依此类推。你想要具有最高计数和最早(最低)字符串的元组。您可以在max(),min()或sorted()中使用key = function来提供您想要排序或比较的内容,您可能认为这是最大值

(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)

所以现在你有了胜利的元组,但是如果你想自己计算......

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]) )