在其中找到前n个最频繁的字符

时间:2019-10-23 11:01:46

标签: python

给出一个字符串,您必须在其中找到前n个最常见的字符。 如果有两个频率相同的字母,则应首先选择字母顺序更早的值:

string=  "aabbccc"
n =2
list = []
#write your code here
char_dict = {}

for char in string:
    if char not in char_dict:
        char_dict[char] = 1
    else:
        char_dict[char] += 1


sorted_dict=sorted(char_dict.items(), key=lambda x: (x[1],x[0]))

sorted_dict = sorted_dict[-2:]
for key, value in sorted_dict:
    list.append(key)
print(list)

我的输出是['b','c'],但实际上应该是c和a。

3 个答案:

答案 0 :(得分:2)

问题在于排序。您需要按不同方向的两个字段进行排序(1个升序和1个降序)。将sorted_dict 2行更改为:

sorted_dict = sorted(char_dict.items(), key=lambda x: (-x[1], x[0]))
sorted_dict = sorted_dict[:n]

btw:避免将python的关键字(例如list)用作变量名。将其命名为myList或类似名称。

答案 1 :(得分:2)

以下是针对您的问题的最佳解决方案之一(代码更少)

string=input()
n=int(input())
import collections
out=[collections.Counter(string).most_common(i+1)[i][0] for i in range(n)]
out.sort()
print(out)

答案 2 :(得分:0)

我在声明之后添加了打印输出。 该代码应为自描述代码。

from collections import defaultdict

string=  "aabbccc"
n = 2

result = defaultdict(int)
for char in string:
    result[char] += 1
print(result)  # defaultdict(<class 'int'>, {'b': 2, 'a': 2, 'c': 3})

ordered_result = sorted(result.items(), key=lambda x: (-x[1], x[0]))
print(ordered_result)  # [('c', 3), ('a', 2), ('b', 2)]

ordered_list = [x[0] for x in ordered_result]
print(ordered_list[:n])  # ['c', 'a']