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

时间:2014-01-30 01:37:36

标签: python sorting

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

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

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

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

如果"myKey"不存在,则无效。 编辑:如果词典中不存在myKey,我希望它出现在列表的末尾。

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

4 个答案:

答案 0 :(得分:8)

结帐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。 (可以跳过该参数,但我将其包括在内)

答案 1 :(得分:1)

如果你真的被卡住了(就像我一样,由于我试图排序的数据的结构),你可能想要打破lambda设计,至少为了诊断目的。只有当我应用"nonesorter" design shown here时,才会收到Python的有意义的诊断信息,告诉我我正在排序的东西不是我想象的那样。

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

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

正如Python.org's Sorting HOW TO所述,

  

key参数的值应该是一个带a的函数   单个参数并返回用于排序目的的密钥。这个   技术很快,因为关键功能只被调用一次   每个输入记录。

最后,请注意,正如其他人所说,在Python 2中,None是一个可比较的合法项目,而with Python 3 attempting to compare to None generates a compiler exception.

答案 2 :(得分:0)

>>> 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'}]

答案 3 :(得分:0)

怎么样?
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列表。我还假设如果密钥不存在,则应该忽略它,这似乎是有道理的。