2

我对 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)

但这导致列表按字母数字而非数字排序。

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

4

3 回答 3

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)
于 2012-06-20T07:03:55.307 回答
1

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

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

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

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

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

于 2012-06-20T07:09:51.773 回答
0

您还可以使用 python 的排序是稳定的事实:

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

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

于 2012-06-20T07:09:11.873 回答