Sta*_*uru 2 sorting operators python-3.x nonetype
我有包含key:value对列表的字典。如何对包含key:value对的列表进行排序(其中值为None)
from operator import itemgetter
test = {"test":[{ "name" : "Nandini", "age" : 20}, { "name" : "Manjeet", "age" : 20 }, { "name" : None , "age" : 19 }] }
print(sorted(test["test"], key=itemgetter('name')) )
Run Code Online (Sandbox Code Playgroud)
结果到 TypeError: '<' not supported between instances of 'NoneType' and 'str'
输出应包括None值,如下所示:[{ "name" : None , "age" : 19 }, { "name" : "Manjeet", "age" : 20 },{ "name" : "Nandini","age" : 20}]
您可以使用“或”技巧:
# python 2 you can use with the itemgetter('name')
# python3 needs a lambda, see further below
from operator import itemgetter
test = {"test":[{ "name" : "Nandini", "age" : 20},
{ "name" : "Manjeet", "age" : 20 },
{ "name" : None , "age" : 19 }] }
# supply a default value that can be compared - here "" is a good one
print(sorted(test["test"], key=itemgetter('name') or "") )
Run Code Online (Sandbox Code Playgroud)
要得到:
[{'age': 19, 'name': None},
{'age': 20, 'name': 'Manjeet'},
{'age': 20, 'name': 'Nandini'}]
Run Code Online (Sandbox Code Playgroud)
您基本上为 None 提供了一个默认值(和空字符串 - 它对值的真实性进行操作)。
对于python 3,你需要使用 lambda 来代替:
print(sorted(test["test"], key=lambda x: x['name'] or "" ))
Run Code Online (Sandbox Code Playgroud)
更多信息:
这里的 lambda 有点像 itemgetter() -x是列表的每个内部字典,x["name"]是您想要作为键的值,如果它是 Falsy (None, ""),它将使用您在 之后提供的任何内容or:
print(None or "works")
print("" or "works as well")
Run Code Online (Sandbox Code Playgroud)