<p>让我给你介绍一个更复杂但更有力的答案。如果对字典项进行排序,可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow noreferrer">itertools.groupby</a>获得一些强大的结果:</p>
<pre><code>import itertools
foo = {"one": 1, "two": 2, "three": 3, "tres": 3, "dos": 2, "troi": 3}
sorted_kvp = sorted(foo.items(), key=lambda kvp: -kvp[1])
grouped = itertools.groupby(sorted_kvp, key=lambda kvp: kvp[1])
</code></pre>
<p><code>sorted</code>行获取字典项的键/值对,并根据值对它们进行排序。我在前面放了一个<code>-</code>,这样这些值就可以按降序排序了。该行的结果是:</p>
<blockquote>
<p>>>> print(sorted_kvp)</p>
<p>[('tres', 3), ('troi', 3), ('three', 3), ('two', 2), ('dos', 2), ('one', 1)]</p>
</blockquote>
<p>注意,如上所述,键的顺序(在本例中是“tres”、“troi”和“three”,然后是“two”和“dos”)是任意的,因为字典中键的顺序是任意的。你知道吗</p>
<p><code>itertools.groupby</code>行从数据运行中生成组。lambda告诉它查看每个键值对的<code>kvp[1]</code>,即值。你知道吗</p>
<p>目前,你只对最大值感兴趣,所以你可以这样做:</p>
<pre><code>max, key_grouper = next(grouped)
print("{}: {}".format(max, list(key_grouper)))
</code></pre>
<p>并得到以下结果:</p>
<blockquote>
<p>3: [('tres', 3), ('troi', 3), ('three', 3)]</p>
</blockquote>
<p>但是,如果您希望对所有信息进行排序,则使用此方法,同样简单:</p>
<pre><code>for value, grouper in grouped:
print("{}: {}".format(value, list(grouper)))
</code></pre>
<p>产生:</p>
<blockquote>
<p>3: [('tres', 3), ('troi', 3), ('three', 3)] </p>
<p>2: [('two', 2), ('dos', 2)] </p>
<p>1: [('one', 1)]</p>
</blockquote>
<p>最后一点注意:您可以使用<code>next</code>或for循环,但使用这两种方法会得到不同的结果。<code>grouped</code>是一个迭代器,对它调用<code>next</code>会将它移到下一个结果(for循环会消耗整个迭代器,因此随后的<code>next(grouped)</code>会导致<code>StopIteration</code>异常)。你知道吗</p>