如何返回放在字典中的第一个最高值

时间:2016-09-09 21:01:54

标签: python string dictionary

dic = {}
count = 0
i = 0
str_in = str_in.replace(' ','')
while i < len(str_in):
    count = str_in.count(str_in[i])
    dic[str_in[i]] = count
    i += 1
for key in dic:
    if key == max(dic, key=dic.get):
        return key
        break

此程序中的字典是

{'i': 1, 'h': 2, 'j': 2, 'o': 2, 'n': 1, 's': 2}
来自输入'joshin josh'

我很确定字典的最大值会返回h,因为它是字典中具有最高值的第一个值,即使是绑定的。 我希望它返回j,因为这是我在字典中输入的第一个字母。看起来字典会按字母顺序自动对字母进行排序,我也不明白。我希望这可以使用任何字符串和所有绑定的字母,而不仅仅是这个特定的字符串。纠正我,如果我错了什么,我是一个菜鸟。

3 个答案:

答案 0 :(得分:2)

另一种方法是,通过使用OrderedDict作为mixin类,它允许轻松组合有序的Counter类。然后,您可以使用从most_common方法返回的列表的第一个条目。

e.g。

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
    pass

oc = OrderedCounter('joshin josh')
print(oc.most_common()[0])

会给你一个字母和出现次数的元组。 e.g。

  

('j',2)

在你传递空字符串的情况下,你需要保护[0],没有什么是最常见的。

为了更好地理解为什么这有效,我建议观看PyCon 2015的Raymond Hettingers Super Considered Super talk .Youtube链接here

答案 1 :(得分:1)

如果您不想手动计算,可以使用Python Counter计算字母出现次数,找到最大值,然后返回字符串中与该计数匹配的第一个字母:

from collections import Counter

string = 'joshin josh'
counts = Counter(string)
max_count = max(counts.values())
print(next(c for c in string if counts[c] == max_count))  # j

next(c for c in string if letter_counts[c] == max_count)返回给定字符串中的第一个字母,其中count是最大计数。

更优化的方法

以前的方法会让您在最坏的情况下遍历字符串三次。对于一次通过的方法,在迭代字符串时跟踪最大计数和与之对应的字母是最有效的:

from collections import defaultdict

counts = defaultdict(int)
max_letter = None
max_count = 0
string = 'joshin josh'
for c in string:
    counts[c] += 1
    if counts[c] > max_count:
        max_letter = c
        max_count = counts[c]

print(max_letter)  # j

答案 2 :(得分:0)

您可以使用OrderedDict

只需一个简单的更改即可解决您的问题

ord_dic = OrderedDict(sorted(dic.items(), key=lambda t: str_in.index(t[0])))

所以你可以使用像

这样的东西
dic = {}
count = 0
i = 0
str_in = str_in.replace(' ','')
while i < len(str_in):
    count = str_in.count(str_in[i])
    dic[str_in[i]] = count
    i += 1
ord_dic = OrderedDict(sorted(dic.items(), key=lambda t: str_in.index(t[0])))
for key in ord_dic:
    if key == max(ord_dic, key=ord_dic.get):
        return key
        break

不要忘记导入OrderedDict
在代码顶部添加此行:

from collections import OrderedDict