数字排序的字典对象列表

时间:2012-06-20 07:02:13

标签: python sorting numeric alphanumeric

我对python编程很陌生,还没有购买有关此问题的教科书(我今天在商店或亚马逊购买)。与此同时,你能帮助我解决我遇到的以下问题吗?

我有一个像这样的字典对象列表:

stock = [ 
  { 'date': '2012', 'amount': '1.45', 'type': 'one'},
  { 'date': '2012', 'amount': '1.4', 'type': 'two'},
  { 'date': '2011', 'amount': '1.35', 'type': 'three'},
  { 'date': '2012', 'amount': '1.35', 'type': 'four'}
]

我想按金额日期列排序列表,然后按金额列排序,以便排序列表如下所示:

stock = [ 
  { 'date': '2011', 'amount': '1.35', 'type': 'three'},
  { 'date': '2012', 'amount': '1.35', 'type': 'four'},
  { 'date': '2012', 'amount': '1.4', 'type': 'two'},
  { 'date': '2012', 'amount': '1.45', 'type': 'one'}
]

我现在认为我需要使用sorted()但作为初学者,我很难理解我所看到的概念。

我试过了:

from operator import itemgetter
all_amounts = itemgetter("amount")
stock.sort(key = all_amounts)

但是这导致了一个按字母数字而不是数字排序的列表。

有人可以告诉我如何实现这种看似简单的排序吗?感谢您!

3 个答案:

答案 0 :(得分:3)

对于operator.itemgetter,您的排序条件过于复杂。您将不得不使用lambda函数:

stock.sort(key=lambda x: (int(x['date']), float(x['amount'])))

all_amounts = lambda x: (int(x['date']), float(x['amount']))
stock.sort(key=all_amounts)

答案 1 :(得分:1)

首先将数据转换为适当的格式:

stock = [
    { 'date': int(x['date']), 'amount': float(x['amount']), 'type': x['type']}
    for x in stock
]

现在stock.sort(key=all_amounts)将返回正确的结果。

由于您似乎是编程方面的新手,如果可以的话,这里有一个通用建议:

  

正确的数据结构是成功的90%。不要试图通过编写更多代码来解决损坏的数据。创建一个适合您任务的结构,并尽可能少地编写代码。

答案 2 :(得分:0)

您还可以使用python排序为stable的事实:

stock.sort(key=lambda x: int(x["amount"]))
stock.sort(key=lambda x: int(x["date"]))

由于具有相同键的项目在排序时保持相对位置(它们从不交换),您可以通过多次排序来构建复杂的排序。