用lambda

时间:2017-08-29 10:37:39

标签: python sorting lambda

我想按照小到大的确认次数对列表进行排序。如果确认为空,则确认编号与零相同。我收到以下错误。怎么解决它?

排序前

[
    {
      'id':'1',
      'confirmation':'20',
    },
    {
      'id':'2',
      'confirmation':'10',
    },
    {
      'id':'3'
    }
]

排序后

[
    {
       'id':'3'
    },
    {
      'id':'2',
      'confirmation':'10',
    },    
    {
      'id':'1',
      'confirmation':'20',
    }
]

测试

$ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31) 

>>> dict1 = {"id":1, "confirmation":20}
>>> dict2 = {"id":2, "confirmation":10}
>>> dict3 = {"id":3}
>>> list = [dict1, dict2, dict3]
>>> sorted_list = sorted(list, key=lambda x: x['confirmation'], reverse=True)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
KeyError: 'confirmation'

更新1

>>> sorted_list = sorted(list, key=lambda x: int(x.get('confirmation', 0)), reverse=False)
>>> sorted_list
[{'id': 3}, {'id': 2, 'confirmation': 10}, {'id': 1, 'confirmation': 20}]

2 个答案:

答案 0 :(得分:3)

您可以使用dict.get取消KeyError提供默认值0

sorted_list = sorted(lst, key=lambda x: int(x.get('confirmation', 0)), reverse=True)

另外,请记住将字符串值转换为数字类型,因此排序是数字而非词典。

答案 1 :(得分:0)

您可以使用dict.get函数将默认值0指定为&#34;确认&#34;如果密钥不在密码中,则为密钥。

lst = [
    {
      'id':'1',
      'confirmation':'20',
    },
    {
      'id':'2',
      'confirmation':'10',
    },
    {
      'id':'3'
    }
]
sorted_list = sorted(lst, key = lambda x : int(x.get('confirmation',0)))
print sorted_list