【问题标题】:Python sort list of dictionary with zero values at the endPython排序字​​典列表末尾为零值
【发布时间】:2017-09-01 16:26:36
【问题描述】:

我有零值的同质字典列表,但它可以包含任何类型的值。示例:

values=[{'buy_qty': 15, 'product_id': 30}, {'buy_qty': 0,'product_id': 33},{'buy_qty': 25, 'product_id': 50}, {'buy_qty': 7, 'product_id': 22}]

有没有办法在不重新发明轮子的情况下让列表按 python 方式通常的“最小“购买数量”排序,但列表末尾的“零”值,如下所示:

values=[{'buy_qty': 7, 'product_id': 22}, {'buy_qty': 15, 'product_id': 30}, {'buy_qty': 25, 'product_id': 50}, {'buy_qty': 0,'product_id': 33}]

我已经尝试过使用 itemgetter,

sorted(total_lines, key=itemgetter('buy_qty'))

我觉得这里可以有一些“关键”参数的技巧

【问题讨论】:

  • 你的itemgetter在做什么?

标签: python list sorting dictionary


【解决方案1】:

你是对的关键功能。我添加了一个按 buy_qty 排序的关键函数,除非它不大于零,然后将其视为无穷大,基本上将其移动到最后。

 sorted(values, key = lambda x: x['buy_qty'] if x['buy_qty'] > 0 else float('inf'))

【讨论】:

  • 你是传奇+1,我会在3分钟内接受答案:)
【解决方案2】:

您可以定义任何用作排序的函数 - 在 sorted 之外或在内部使用 lambda。这样,您可以例外(在这种情况下为 0 数量)

 sorted(values, key=lambda x: x['buy_qty'] if x['buy_qty'] > 0 else float('Inf'))

【讨论】:

    【解决方案3】:

    使用自定义比较函数。

    def custom_comparator(item1, item2):
        if item1 == item2:
                return 0
        elif 0 < item1 < item2 or item2 == 0:
                return -1
        else:
                return 1
    
     sorted(total_lines, cmp=custom_comparator, key=itemgetter('buy_qty'))
    

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多