我有一个像这样的列表
li = [
{1: {'amount': 255, 'date': '25-02-2017'}},
{2: {'amount': 25, 'date': '2-02-2017'}},
{3: {'amount': 38, 'date': '20-02-2017'}},
]
我正在尝试根据'amount'
按升序和降序对数据进行排序。
我尝试了以下操作,但无法获得我想要的结果:
import operator
li.sort(key=operator.itemgetter('amount'))
和
from operator import itemgetter
newlist = sorted(li, key=itemgetter('amount'))
两者都引发异常KeyError: 'amount'
。
答案 0 :(得分:6)
您有一个包含单个键的词典列表,其值是另一个词典。这是嵌套字典,其密钥为'amount'
。
您必须进入并获得该单一值:
newlist = sorted(li, key=lambda d: d.values()[0]['amount'])
这仅适用于Python 2,其中d.values()
是一个列表。在Python 3中,您必须使用next(iter(d.values())['amount']
代替。
您最好不要在所有中生成嵌套结构。将这些编号的键移动到另一个键值对中:
li = [
{'id': 1', amount': 255, 'date': '25-02-2017'},
{'id': 2, 'amount': 25, 'date': '2-02-2017'},
{'id': 3, 'amount': 38, 'date': '20-02-2017'},
]
此时您的原始尝试将起作用。您可以使用[dict(id=d.keys()[0], **d.values()[0]) for d in li]
转换当前数据结构,但最好修复生成列表的代码。
答案 1 :(得分:1)
尝试以下使用lambdas的代码,
li=[{1:{'amount':255,'date':'25-02-2017'}},{2:{'amount':25,'date':'2-02-2017'}},{3:{'amount':38,'date':'20-02-2017'}}]
print(li)
li.sort(key=lambda x:list(x.values())[0]['amount']) # ascending
print(li)
li.sort(key=lambda x:list(x.values())[0]['amount'],reverse=True) # descending
print(li)