[英]How to use filter in python to filter a dictionary in this situation?
我以前從未使用過python。 現在我有一個像這樣的字典:
d1 = {1:2,3:3,2:2,4:2,5:2}
每對中的對[0]表示點,每對中的對[1]表示集群ID。 因此,d1表示點1屬於群集2,點3屬於群集3,點2屬於群集2,點4屬於群集2,點5屬於群集2。沒有點屬於群集1。如何使用filter( (不要使用循環)來獲得如下字典:
d2 = {1:[],2:[1,2,4,5],3:[3]}
這意味着沒有點屬於群集1,1,2,4,5屬於群集2,3不屬於群集3。
d2 = dict(filter(lambda a,b: a,b if a[1] == b[1] , d1.items()))
from collections import defaultdict
d2 = defaultdict(list)
for point, cluster in d1.items():
d2[cluster].append(point)
您的defaultdict
不會包含集群1
,但是如果您知道期望的集群,那么一切都會好起來的(因為當您嘗試查看時,空列表將放入該插槽中-這是defaultdict
的“默認”部分):
expected_clusters = [1, 2, 3]
for cluster in expected_clusters:
print(d2[cluster])
FWIW,使用內置filter
解決此問題只是精神錯亂。 但是,如果必須的話,可以執行以下操作:
d2 = {}
filter(lambda (pt, cl): d2.setdefault(cl, []).append(pt), d1.items())
請注意,我正在使用python2.x的參數解壓縮。 對於python3.x,您需要執行類似lambda item: d2.setdefault(item[1], []).append(item[0])
,或者也許我們可以做類似的事情更好:
d2 = {}
filter(lambda pt: d2.setdefault(d1[pt], []).append(pt), d1)
我們可以做一點點更好的reduce
內置(至少reduce
,並非單純的交通工具,以創建一個隱含的循環,因此實際上返回我們想要的字典):
>>> d1 = {1:2,3:3,2:2,4:2,5:2}
>>> reduce(lambda d, k: d.setdefault(d1[k], []).append(k) or d, d1, {})
{2: [1, 2, 4, 5], 3: [3]}
但這仍然是真正丑陋的python。
>>> d1 = {1:2,3:3,2:2,4:2,5:2}
>>> dict(map(lambda c : (c, [k for k, v in d1.items() if v == c]), d1.values()))
{2: [1, 2, 4, 5], 3: [3]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.