我創建了一個命名元組的字典串列,以事件型別為鍵。
[{'EVENT_DELETE': DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)}]
回傳/列印僅包含“已批準= 1”或“已審核= 1”和“已批準= 0”的結果的最pythonic方法是什么?
uj5u.com熱心網友回復:
不確定您到底想要什么輸出格式,但這里有一個approved == 1.
>>> from collections import namedtuple
>>> DeleteRequestDetails = namedtuple('DeleteRequestDetails', 'rid user type reviewed approved completed')
>>> lst = [{'EVENT_DELETE': DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)}]
>>> [v for d in lst for v in d.values() if v.approved == 1]
[DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0),
DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)]
uj5u.com熱心網友回復:
這是一個可能的解決方案:
# data = [{'EVENT_DELETE': DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)},{'EVENT_DELETE': DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)}]
res = filter(
lambda _: _.approved == 1 or (_.reviewed == 1 and _.approved == 0),
(b for a in data for b in a.values())
)
print(next(res))
# DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0)
基本上,我們只是內置filter函式并使用自定義 (lambda-) 函式。
請注意,過濾器回傳一個類似生成器的物件。list如果您需要多次訪問資料,您可以將其包裝起來。
聚苯乙烯
正如@PatrickArtner 指出的那樣,擁有一個包含 1 個值的字典串列是沒有意義的。這樣的事情更有意義:
data = {
"EVENT_DELETE": [
DeleteRequestDetails(rid=53421, user='user1', type='EVENT_DELETE', reviewed=1, approved=1, completed=0),
DeleteRequestDetails(rid=13423, user='user2', type='EVENT_DELETE', reviewed=1, approved=1, completed=0),
DeleteRequestDetails(rid=98343, user='user2', type='EVENT_DELETE', reviewed=1, approved=0, completed=0)
]
}
這使得解決方案也更加清晰和簡單,因為不需要遍歷值,例如
res = filter(
lambda _: _.approved == 1 or (_.reviewed == 1 and _.approved == 0),
data["EVENT_DELETE"]
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/390990.html
上一篇:我的樸素貝葉斯分類器適用于我的模型,但不會在我的應用程式上接受用戶輸入
下一篇:用戶鍵鍵盤輸入
