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,因为这是我在字典中输入的第一个字母。看起来字典会按字母顺序自动对字母进行排序,我也不明白。我希望这可以使用任何字符串和所有绑定的字母,而不仅仅是这个特定的字符串。纠正我,如果我错了什么,我是一个菜鸟。
答案 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