【问题标题】:How to do multiple comparisons while sorting a dictionary of lists in python?如何在python中对列表字典进行排序时进行多重比较?
【发布时间】:2017-02-28 09:14:45
【问题描述】:

我有一本列表字典,summary

summary = {
    'Raonic': [2, 0, 11, 122, 16, 139],
    'Halep': [2, 2, 10, 75, 6, 60],
    'Kerber': [2, 0, 7, 68, 7, 71],
    'Wawrinka': [1, 2, 14, 133, 13, 128],
    'Djokovic': [2, 2, 10, 75, 8, 125],
}

我希望在屏幕(标准输出)上打印出一个按排名降序排列的摘要,其中排名是按照标准 1-6 的顺序排列的(比较项目 1(列表中的),如果相等比较(列表中的)第 2 项,如果它们相等,请比较(列表中的)第 3 项。这种比较会一直持续到列表中的第 4 项,降序

但是列表的第 5 项和第 6 项的比较必须按升序进行。

输出:

Halep 2 2 10 75 6 60
Djokovic 2 2 10 75 8 125
Raonic 2 0 11 122 16 139
Kerber 2 0 7 68 7 71
Wawrinka 1 2 14 133 13 128

我的解决方案是:

for key, value in sorted(summary.items(), key=lambda e: e[1][0], reverse = True):
    print(key, end=' ')
    for v in value:
        print(v, end=' ')
    print()

但是我的解决方案只是成功地对列表的第 1 列进行了排序。

访问this site for full question

【问题讨论】:

  • 从链接来看,这看起来像是一个没有事先努力的家庭作业问题
  • 这是一个任务,是的。除了如何使用多重比较对字典进行排序之外,我确实完成了所有工作。当我发布问题时,我还没有找到令人满意的答案。

标签: python sorting dictionary


【解决方案1】:

对于数值,您可以取反该值以获得逆排序。对于您的排序键,返回要排序的值序列,否定“相反”方向的值:

ranked = sorted(
    summary.items(),
    key=lambda kv: kv[1][:4] + [-kv[1][4], -kv[1][5]],
    reverse=True)

这会按排序顺序生成 (key, value) 元组,因为字典是无序的。

对于('Halep', [2, 2, 10, 75, 6, 60]),排序键 lambda 返回 [2, 2, 10, 75, -6, -60],确保在 'Djokovic' 之前排序,其中排序键设置为 [2, 2, 10, 75, -8, -125],因为排序顺序相反( reverse=True),-6 排在-8 之前。但是,前 4 列中的任何值差异都会按另一个方向排序,因此第一列中包含3 或更多的任何内容将排在('Halep', [...]) 之前,或者以2, 3 或更高开头的任何内容等等。

如果值不是数字,并且列没有其他可用的“反向”值选项,则您必须两次排序。首先在最后 2 列(按升序排序),然后在前 4 列(按降序,所以颠倒顺序):

# non-numeric option
part_sorted = sorted(summary.items(), key=lambda kv: kv[1][-2:])
ranked = sorted(part_sorted, key=lambda kv: kv[1][:4], reverse=True)

之所以有效,是因为 Python 的排序算法(称为Timsort)是稳定,因此排序键完全相等的任何两个输入的相对顺序不会受到影响。因此,任何键 AB,只有最后一个或两列不同,在 part_sorted 中给出了相对排序,然后在 ranked 中不会改变因为part_sorted 订单未受影响。如果 A 在第一次排序中排在 B 之后,那么第二次排序将在 B 之后离开 A。 p>

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2016-06-11
    • 2021-04-17
    相关资源
    最近更新 更多