我有一个这样的词典列表:
[{"foo" : "bar", "myKey" : "one"},
{"foo" : "bar", "myKey" : "two"},
{"foo" : "bar", "yourKey" : "three"}]
如果它存在,我想通过字典中的键对其进行排序。
featured = sorted(filesToWrite, key=lambda k: k["myKey"])
如果"myKey"
不存在,则无效。 编辑:如果词典中不存在myKey
,我希望它出现在列表的末尾。
我可以手动循环遍历列表并自己完成但是我确信有一种pythonic方法可以实现我的目标而不会完成所有这些。
答案 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列表。我还假设如果密钥不存在,则应该忽略它,这似乎是有道理的。