Python 打印字典中最大和第二大元素

Python 打印字典中最大和第二大元素,python,Python,我已经编写了一个函数,该函数将字符串作为输入,并移交一个字典,该字典指示出现最多的元素/字符 第1部分-寻找最常出现的角色 但后来我变得更好奇了,我想打印字典中出现频率最高和第二多的元素。因此,我写了这样的东西: from collections import Counter import heapq string = "aabbccdddddddd" counts = Counter(string) heapq.nlargest(2, counts, key=lambda k: counts[

我已经编写了一个函数,该函数将字符串作为输入,并移交一个字典,该字典指示出现最多的元素/字符

第1部分-寻找最常出现的角色 但后来我变得更好奇了,我想打印字典中出现频率最高和第二多的元素。因此,我写了这样的东西:

from collections import Counter
import heapq
string = "aabbccdddddddd"
counts = Counter(string)
heapq.nlargest(2, counts, key=lambda k: counts[k])
第二部分-好的,现在让我们找到第二个最常出现的角色
#定义一个字典来存储出现次数最多和次多的元素
最大={‘最常发生’:0,‘第二常发生’:0}
#嵌套循环以遍历字典中的所有值
对于ans.items()中的a:#O(N)
对于ans.items()中的b:#O(N)
如果a
大O 我在它旁边写了每个操作的大O,当我看到它时,我真的不喜欢我写的东西。我的意思是,O(N^2)听起来既昂贵又低效

你愿意告诉我更好的写作方法吗

请记住,我不是在寻找一种利用 任何图书馆


使用heapq.nlargest,如下所示:

from collections import Counter
import heapq
string = "aabbccdddddddd"
counts = Counter(string)
heapq.nlargest(2, counts, key=lambda k: counts[k])
不使用库,假设函数返回与计数器相同的内容:

keys = list(counts.keys())
keys.sort(key=lambda x: counts[x],reverse=True)
top_two = keys[:2] # just the keys
{ k : counts[k] for k in keys[:2] } # dict of top two

下面是一个在
O(n)
中执行此操作的简单算法:

这将打印
{'second-most-received':'b','most-received':'d}


请注意,我在
string
中添加了一个额外的“b”,以使其成为第二个最常见的字母如果a是O(n),您认为
为什么?我把它看作O(1)。这是
O(n**2)
,因为
a
O(1)
。一个
O(n)
解决方案是遍历列表一次,并跟踪您看到的两个最高值。另外,我的理解是,循环的每个周期都会发生“如果”,因此,它是(O(f(n)xg(n)),我错了吗?可能会给你另一个简化方法的视角。@PatrickHaugh你发送的链接需要一个库。我必须从“集合”中导入“计数器”,这是我在发布问题之前知道的……没有库,没有内置函数。仔细阅读问题。我知道计数器。对不起,错过了那一行。在我的答案中添加一个编辑。您可以将两行代码合并到->第二行,最大=最大,entryOverall中,非常感谢您提供的解决方案。我喜欢:)你好,伙计,我已经看到从数组中删除“无”会导致错误!我不明白为什么!您能告诉我吗?for循环正在尝试访问每个数组的第二个元素(索引1),如果您不删除任何元素,您将得到一个索引器。因此,在使用一个元素的循环并访问索引0之后,为什么我们不仍然得到索引错误?
keys = list(counts.keys())
keys.sort(key=lambda x: counts[x],reverse=True)
top_two = keys[:2] # just the keys
{ k : counts[k] for k in keys[:2] } # dict of top two
string = "aabbbccdddddddd"

def get_frequency(string):
    chars = {}
    for char in string:
        chars[char] = chars.get(char, 0) + 1 

    biggest = [None, 0]
    second = [None, 0]

    for entry in chars.items():
        char, count = entry
        if count > biggest[1]:
            second = biggest
            biggest = entry
        elif count > second[1]:
            second = entry

    return {
        "most-occurring": biggest[0],
        "second-most-occurring": second[0]
    }

print(get_frequency(string))