gpt4 book ai didi

python - 在这种情况下如何使用Python中的过滤器来过滤字典?

转载 作者:行者123 更新时间:2023-12-01 04:01:24 30 4
gpt4 key购买 nike

我以前从未使用过Python。现在我有一本像这样的字典:

d1 = {1:2,3:3,2:2,4:2,5:2}

每对中的pair[0]表示点,每对中的pair[1]表示簇id。因此 d1 表示点 1 属于聚类 2,点 3 属于聚类 3,点 2 属于聚类 2,点 4 属于聚类 2,点 5 属于聚类 2。没有点属于聚类 1。如何使用过滤器(不使用循环)来获取如下字典:

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。

关于python - 在这种情况下如何使用Python中的过滤器来过滤字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36441474/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com