簡體   English   中英

在這種情況下,如何使用python中的filter過濾字典?

[英]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()))

我會用一個collections.defaultdict

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]}
  1. lambda函數獲取值列表
  2. 使用上述lambda的map函數來映射值(集群)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM