Python 按缺少某些项的值对字典列表进行排序

Python 按缺少某些项的值对字典列表进行排序,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我有一份清单如下: a = [ {'p': 3, 'id': 'ab1'}, {'p': 10, 'id': 'ab2'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'id': 'ab5'} ] 我想根据p的值对a进行排序。如果dict没有p,请将其放在后面。 我试着这样做: print sorted(a, key=lambda i: i.get('p')) 结果是: [{'id': 'ab5'}, {'p'

我有一份清单如下:

a = [
   {'p': 3, 'id': 'ab1'},
   {'p': 10, 'id': 'ab2'},
   {'p': 5, 'id': 'ab3'},
   {'p': 8, 'id': 'ab4'},
   {'id': 'ab5'}
]
我想根据
p
的值对
a
进行排序。如果dict没有
p
,请将其放在后面。 我试着这样做:

print sorted(a, key=lambda i: i.get('p'))
结果是:

[{'id': 'ab5'}, {'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}]
但我想得到的是:

[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'},{'id': 'ab5'}]
我能做些什么以更简单的方式获得正确的结果?

使用

a = [
   {'p': 3, 'id': 'ab1'},
   {'p': 10, 'id': 'ab2'},
   {'p': 5, 'id': 'ab3'},
   {'p': 8, 'id': 'ab4'},
   {'id': 'ab5'}
]

print(sorted(a, key=lambda i: i.get('p', "NA"))) #Setting a string as a default value. 
#python 3  --> https://stackoverflow.com/questions/49829732/sorting-a-mixed-list-of-ints-and-strings
print(sorted(a, key=lambda v: (isinstance(v.get('p', "NA"), str), v.get('p', "NA"))))
输出:

[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}, {'id': 'ab5'}]

对于python2和python3,您可以如下操作,其中我假设
p
的值缺失,我假设
sys.maxsize
的值,这将确保如果
p
的值缺失,它们始终位于列表的末尾

import sys
a = [
   {'p': 3, 'id': 'ab1'},
   {'p': 10, 'id': 'ab2'},
   {'p': 5, 'id': 'ab3'},
   {'p': 8, 'id': 'ab4'},
   {'id': 'ab5'}
]

print(sorted(a, key=lambda i: i.get('p', sys.maxsize)))
这会给你

[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'}, {'id': 'ab5'}]
如果与
sys.maxsize
相比较,另一种解决方案是,将没有键
p
的字典分离出来,对包含键
p
的剩余字典进行排序,然后通过像这样附加非
p
键字典来扩展它。这也避免了我们在
item.get()中为
p
提供默认值


这里有一个我更喜欢的选项,它不使用
lambda

import sys
from operator import methodcaller

a = [
   {'p': 3, 'id': 'ab1'},
   {'p': 10, 'id': 'ab2'},
   {'p': 5, 'id': 'ab3'},
   {'p': 8, 'id': 'ab4'},
   {'id': 'ab5'}
]

print(sorted(a, key=methodcaller('get', 'p', sys.maxsize)))

您确定字符串可以与int进行比较吗
TypeError:“上述代码将适用于
python2
,但不适用于
python3
,因为它将失败并出现错误
TypeError:”
import sys
from operator import methodcaller

a = [
   {'p': 3, 'id': 'ab1'},
   {'p': 10, 'id': 'ab2'},
   {'p': 5, 'id': 'ab3'},
   {'p': 8, 'id': 'ab4'},
   {'id': 'ab5'}
]

print(sorted(a, key=methodcaller('get', 'p', sys.maxsize)))