[英]Sort a list of dictionaries by a key, based on the order of keys in a separate list in Python
[英]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.