求助:Python中从含人名键的嵌套字典提取最大相似度值的方法
解决嵌套人名键defaultdict找最相似人物的问题
我太懂你这种找不到适配方案的郁闷了!翻了一堆帖子全是统一字符串键的例子,完全套不上你这种用人名当键的嵌套defaultdict场景对吧?你的结构是外层键是被比对的人物,内层键是其他所有人,对应值是二者的相似度,目标就是找出每个人最相似的那个人,对吧?
先给你理清楚思路,再上可直接用的代码:
先明确你的数据结构(模拟示例)
假设你的finalDict长这样:
from collections import defaultdict # 模拟你的嵌套defaultdict结构 finalDict = defaultdict(dict) finalDict["Alice"]["Bob"] = 0.85 finalDict["Alice"]["Charlie"] = 0.62 finalDict["Bob"]["Alice"] = 0.85 finalDict["Bob"]["Charlie"] = 0.41 finalDict["Charlie"]["Alice"] = 0.62 finalDict["Charlie"]["Bob"] = 0.41
核心解决代码
这段代码会遍历每个人,找出他们的最相似对象,还特意处理了「排除自己和自己比对」的情况(如果你的数据里有自己的相似度值,比如1.0,这一步很关键):
# 用来存储每个人的最相似人物及对应相似度 most_similar = {} for person, similarity_map in finalDict.items(): # 过滤掉自己和自己的相似度(如果你的数据里没有这种情况,可以删掉这行) valid_scores = {other_person: score for other_person, score in similarity_map.items() if other_person != person} if not valid_scores: most_similar[person] = None # 没有其他可比对的人物 continue # 找出相似度最高的人物和分数 closest_person, max_similarity = max(valid_scores.items(), key=lambda item: item[1]) most_similar[person] = (closest_person, max_similarity) # 打印结果看看 for person, result in most_similar.items(): if result: print(f"{person} 最相似的人是 {result[0]},相似度为 {result[1]}") else: print(f"{person} 没有可比对的其他人物")
代码说明
- 遍历外层的每一个被比对者,拿到他们和其他人的相似度字典
- 用字典推导式过滤掉自己(避免把自己当成最相似的人)
- 用
max()函数结合lambda表达式,直接根据相似度值找出最大的那个键值对,也就是最相似的人和对应的分数 - 把结果存在
most_similar字典里,方便后续调用或者输出
如果你的数据里根本不会出现自己和自己的相似度,那可以直接删掉过滤那一行,代码会更简洁。
内容的提问来源于stack exchange,提问作者Mr_Sniff
相关产品推荐
相关产品推荐

