<p>另一个答案解决了这个问题,但我想建议一个更实用的方法:</p>
<pre><code>data = ["tyson 0:11", "usain 0:12", "carl 0:30", "carl 0:20", "usain 0:40", "carl 1:00", "usain 0:57"]
from itertools import groupby
from operator import itemgetter
def process_time(t):
minutes, seconds = map(int, t.split(':'))
return 60 * minutes + seconds
def sort_key(pair):
return (-len(pair[1]), min(pair[1]))
grouped = groupby(sorted(task.split() for task in data),
key=itemgetter(0))
processed = {key: [process_time(time) for name, time in group]
for key, group in grouped}
print(processed)
print([name for name, time in sorted(processed.items(), key=sort_key)])
</code></pre>
<p>输出:</p>
^{pr2}$
<p>首先,我们使用<code>sorted</code>和<code>itertools.groupby</code>对输入数据中的每个条目进行排序和分组。这允许我们以更结构化的形式获取数据<code>dict</code>,其中键是名称,值是<code>lists</code>次。在</p>
<p>在此过程中,我们还将表示时间的字符串处理为以秒为单位的整数。在</p>
<p>接下来,我们要根据<code>dict</code>的值对它们的键进行排序,首先按长度的降序(因为值的长度是任务数),然后按最小时间的递增顺序。在</p>
<p>这是通过指定一个键函数<code>sort_key</code>来完成的,该函数在这里返回一个<code>tuple</code>。键函数的作用是,输入将被排序,就好像键函数被应用于它</em>一样。在</p>
<p><code>tuples</code>按其第一个元素排序,然后按第二个元素排序,依此类推,直到所有连接都断开或到达最后一个元素为止。在本例中,我们有一个2元组,其中第一个元素是输入的<em>负</em>长度,第二个元素是最小值。在</p>
<p>请注意,前者是负数,因为<code>sorted</code>默认情况下按<em>升序</em>排序;通过对长度求反,我们颠倒了排序顺序。在仅对一个元素进行排序的情况下,可以传递<code>reverse=True</code>,但这里我们有两个排序顺序不同的排序。在</p>
<p>所有这些的结果是,我们执行所需的排序以获得答案。在</p>