繁体   English   中英

如果密钥存在,则按密钥对字典的字典列表进行排序

[英]Sort python list of dictionaries by key if key exists

我有一个这样的词典列表:

[{"foo" : "bar", "myKey" : "one"}, 
{"foo" : "bar", "myKey" : "two"}, 
{"foo" : "bar", "yourKey" : "three"}]

如果存在,我想通过字典中的键对其进行排序。

featured = sorted(filesToWrite, key=lambda k: k["myKey"])

如果"myKey"不存在,则不起作用。 编辑:如果myKey中不存在myKey ,我希望它出现在列表的末尾。

我可以手动循环遍历列表并自己完成,但我确信有一种pythonic方法可以实现我的目标而不会完成所有这些。

看看dict.get

featured = sorted(filesToWrite, key=lambda k: ("myKey" not in k, k.get("myKey", None)))

输出:

[{'foo': 'bar', 'myKey': 'one'}, {'foo': 'bar', 'myKey': 'two'}, {'yourKey': 'three', 'foo': 'bar'}]

关键是神奇的事情:

("myKey" in k, k.get("myKey", None)

这是一个两项元组,如:

(True, "one")

第一个元素是True / False,取决于键是否缺失(True出现在False之后,因此not ),第二个元素是所述键的值(如果存在)。 如果没有, None (可以跳过该参数,但我将其包括在内)

如果你真的被卡住了(就像我一样,由于我试图排序的数据结构),你可能想要打破lambda设计,至少为了诊断目的。 只有当我应用这里显示“nonesorter”设计时,我才从Python接收到一个有意义的诊断,它向我展示了我正在排序的东西并不是我想象的那样。

更一般地说:您在上面看到的“lambda”是简写,可以用完整的方法定义替换,您可以使用调试器逐行执行。

此外,对新手的一些误导是标签key=在Python的排序语法中。 这实际上不是字典中关键字段的名称,而是指向将确定顺序的函数的指针,类似于Perl的名为SUBNAME的排序参数。

正如Python.org的排序如何描述它,

key参数的值应该是一个函数,它接受一个参数并返回一个用于排序的键。 这种技术很快,因为每个输入记录只调用一次关键功能。

最后,请注意,正如其他人所说,在Python 2中,None是一个可比较的合法项目,而Python 3试图与None进行比较会产生编译器异常。

>>> L = [{"foo" : "bar", "myKey" : "one"}, 
... {"foo" : "bar", "myKey" : "two"}, 
... {"foo" : "bar", "yourKey" : "three"}]
>>> 
>>> sorted(L, key=lambda d:("myKey" not in d, d.get("myKey")))
[{'foo': 'bar', 'myKey': 'one'}, {'foo': 'bar', 'myKey': 'two'}, {'yourKey': 'three', 'foo': 'bar'}]

关于什么

sorted((e for e in case if 'myKey' in e), key=lambda x: x['myKey']) + [e for e in case if 'myKey' not in e]

...?

假设'case'变量包含你刚才提到的dicts列表。 我还假设如果密钥不存在,应该忽略它,这似乎是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM