簡體   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