我有一个列表a = [('b',1),('k',3),('g',2),('p',3)...] 第一个元组是一个字母,第二个元组是字母发生的频率。我试图找到一个字母的最大出现次数(可以有多个,即k = 3和p = 3)并返回最接近'a'的字母。
我目前的逻辑是:找到最高数量 - >制作另一个列表,只追加第二元组=最高计数的元素 - >对列表进行排序 - >返回第一个元素的第一个元组。
如果有更好的方法在Python中做到这一点(我确信有),我全都耳朵!
但无论如何,在Python中找到最高计数的最有效方法是什么?
目前我使用的是以下方法,但它返回的是列表元素而不是数字。
max(a, key=operator.itemgetter(1))
答案 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]) )