【问题标题】:Sort by value then by key returns different results upon multiple runs?按值排序然后按键在多次运行时返回不同的结果?
【发布时间】:2021-03-15 04:29:09
【问题描述】:

我有一个术语(单词)和分配给它们的分数的字典,例如:

{'goose': 12.34521, 'egg': 8.54021}

我的任务是按分数对它们进行排序,当分数相等时,然后按字典顺序按键,然后简单地以格式打印前 10 个术语:

term1, term2, ..., term10

这就是我所做的:

# term_idf is dict as explained above
term_idf_sorted = sorted(term_idf_dict.items(), key=functools.cmp_to_key(cmp_term_score))
terms_sorted = list(map(lambda p: p[0], term_idf_sorted[:n_top_terms]))
print(", ".join(terms_sorted))

比较函数在哪里

def cmp_term_score(term_score_1, term_score_2):
    if term_score_1[1] == term_score_2[1]:
        return term_score_1[0].casefold() < term_score_2[0].casefold()
    else:
        return term_score_2[1] - term_score_1[1]

当我根据一些文本创建 dict 然后打印排序后的版本时,我会得到类似:

[('parish', 7.427144133408616), ('saar', 4.406719247264253), ('saaremaa', 4.406719247264253), ('jõe', 4.406719247264253), ('villag', 4.208268308540415) ...]

问题是 'jõe' 应该在 'saar' 和 'saaremaa' 之前>,这真的让我很困惑。 我试图更改比较功能,但由于这种字典比较,我的其他测试用例失败了。 [第二次失败发生在 {'egg': 3.05, 'descend': 3.05} 其中 'egg' 在 'descend' 之前打印,但 'descend' 应该是第一个]

如何利用这种词典排序(作为第二优先级)保持一致?

注意。字典术语从文件中读取为 utf-8 字符串。

【问题讨论】:

  • 您的确切 Python 版本是什么?
  • @Selcuk Python 3.8

标签: python python-3.x sorting


【解决方案1】:

默认情况下,元组按字段顺序进行比较。也就是说,元组按它们的第一个字段排序,如果是平局,则比较第二个字段,依此类推。因此,如果您的挑战是如何按分数后跟名称进行排序,它可能就像利用元组的这个固有特性一样简单有一点皱纹:您希望数字排序从高到低,而您希望字典排序从低到高。下面的例子虽然有点棘手。

例子:

word_scores = [('parish', 7.427144133408616), ('saar', 4.406719247264253), ('saaremaa', 4.406719247264253), ('jõe', 4.406719247264253), ('villag', 4.208268308540415)]

sorted_word_scores = sorted(word_scores, key=lambda ws: (0 - ws[1], ws[0]))

print(sorted_word_scores)

输出:

[('parish', 7.427144133408616), ('jõe', 4.406719247264253), ('saaremaa', 4.406719247264253), ('saar', 4.406719247264253), ('villag', 4.208268308540415)]

【讨论】:

  • 看来 functools.cmp_to_key 是不稳定的函数。使用简单的 lambda(如您所写)可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2014-01-18
相关资源
最近更新 更多