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