【问题标题】:Sorting Python List of Dictionaries对 Python 字典列表进行排序
【发布时间】:2016-01-23 07:27:35
【问题描述】:

我有一个列表,我需要对其进行排序。

[{'inventory_id': 25,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 7,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '10',
  'theoretical_qty': 10.0},
 {'inventory_id': 25,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 8,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '3',
  'theoretical_qty': 15.0},
 {'inventory_id': 27,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 9,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '7',
  'theoretical_qty': 21.0}]

我需要根据'sequence'键域对这3条记录进行排序。

排序后的列表输出应该是:

[{'inventory_id': 25,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 8,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '3',
  'theoretical_qty': 15.0},
 {'inventory_id': 27,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 9,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '7',
  'theoretical_qty': 21.0},
 {'inventory_id': 25,
  'location_id': 12,
  'package_id': False,
  'partner_id': False,
  'prod_lot_id': False,
  'product_id': 7,
  'product_qty': 0,
  'product_uom_id': 1,
  'sequence': '10',
  'theoretical_qty': 10.0}]

记录数可以是可变的,并且是动态的 目前它们是 3 条记录,但也可以超过 10 条。

【问题讨论】:

标签: python list sorting dictionary


【解决方案1】:

使用list.sort() 并指定一个键函数,该函数将返回每个字典中sequence 键的值。这里的 key 函数以 lambda 形式提供,但它可以是使用 def 定义的函数。该序列看起来像是数字,所以它可能应该按数字排序,因此int() 转换。最后一件事,如果字典缺少 sequence 键,则序列被视为 0:

vals = [{'theoretical_qty': 10.0, 'product_id': 7, 'sequence': u'10', 'location_id': 12, 'prod_lot_id': False, 'inventory_id': 25, 'package_id': False, 'product_qty': 0, 'product_uom_id': 1, 'partner_id': False}, {'theoretical_qty': 15.0, 'product_id': 8, 'sequence': u'3', 'location_id': 12, 'prod_lot_id': False, 'inventory_id': 25, 'package_id': False, 'product_qty': 0, 'product_uom_id': 1, 'partner_id': False}, {'theoretical_qty': 21.0, 'product_id': 9, 'sequence': u'7', 'location_id': 12, 'prod_lot_id': False, 'inventory_id': 27, 'package_id': False, 'product_qty': 0, 'product_uom_id': 1, 'partner_id': False}]

vals.sort(key=lambda d: int(d.get('sequence', 0)))

from pprint import pprint
pprint(vals)

输出:

[{'inventory_id':25, 'location_id': 12, 'package_id':错误, 'partner_id':错误, 'prod_lot_id':错误, 'product_id': 8, “产品数量”:0, 'product_uom_id': 1, '序列':u'3', “理论数量”:15.0}, {'inventory_id':27, 'location_id': 12, 'package_id':错误, 'partner_id':错误, 'prod_lot_id':错误, 'product_id': 9, “产品数量”:0, 'product_uom_id': 1, '序列':u'7', “理论数量”:21.0}, {'inventory_id':25, 'location_id': 12, 'package_id':错误, 'partner_id':错误, 'prod_lot_id':错误, 'product_id': 7, “产品数量”:0, 'product_uom_id': 1, '序列':u'10', “理论数量”:10.0}]

【讨论】:

  • 排序后。如何完全删除序列键字段?
  • for val in vals: val.pop('sequence', None)
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2011-12-22
  • 2015-05-29
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多