拿这本字典:

{'local': {'count': 7,
    'dining-and-nightlife': {'count': 1,
        'bar-clubs': {'count': 1}
    },
    'activities-events': {'count': 6,
        'outdoor-adventures': {'count': 4},
        'life-skill-classes': {'count': 2}
    }
}}


如何确定最相关的比赛(在30%的余地内)?例如,活动事件的计数为6,因此6/7 = 85%,其子级户外活动的计数为6分之4(66%)。因此,与此最相关的类别是户外探险。

在此示例中:

{'local': {'count': 11,
    'dining-and-nightlife': {'count': 4,
        'bar-clubs': {'count': 4}
    },
    'activities-events': {'count': 6,
        'outdoor-adventures': {'count': 4},
        'life-skill-classes': {'count': 2}
    }
}}


在酒吧俱乐部(100%)和餐饮活动(54%)兼顾餐饮和夜生活(33%)
 户外冒险(66%)。

我希望百分比截止值由

cutoff = 0.3


这里的想法是确定最相关的类别,以删除较小的结果(低于30%)的匹配项。

@ F.J在下面回答了这个问题,但现在我想更新树中的计数。

初始输出:

{'local': {'activities-events': {'count': 6,
                             'life-skill-classes': {'count': 2},
                             'outdoor-adventures': {'count': 4}},
       'count': 11,
       'dining-and-nightlife': {'bar-clubs': {'count': 4}, 'count': 4}}}


发布输出:

{'local': {'activities-events': {'count': 6,
                             'life-skill-classes': {'count': 2},
                             'outdoor-adventures': {'count': 4}},
       'count': 10,
       'dining-and-nightlife': {'bar-clubs': {'count': 4}, 'count': 4}}}

最佳答案

以下应该起作用,请注意,这将适当地修改输入字典:

def keep_most_relevant(d, cutoff=0.3):
    for k, v in list(d.items()):
        if k == 'count':
            continue
        if 'count' in d and v['count'] < d['count'] * cutoff:
            del d[k]
        else:
            keep_most_relevant(v)


例子:

>>> d1 = {'local': {'count': 7, 'dining-and-nightlife': {'count': 1, 'bar-clubs': {'count': 1}}, 'activities-events': {'count': 6, 'outdoor-adventures': {'count': 4}, 'life-skill-classes': {'count': 2}}}}
>>> keep_most_relevant(d1)
>>> pprint.pprint(d1)
{'local': {'activities-events': {'count': 6,
                                 'life-skill-classes': {'count': 2},
                                 'outdoor-adventures': {'count': 4}},
           'count': 7}}

>>> d2 = {'local': {'count': 11, 'dining-and-nightlife': {'count': 4, 'bar-clubs': {'count': 4}}, 'activities-events': {'count': 6, 'outdoor-adventures': {'count': 4}, 'life-skill-classes': {'count': 2}}}}
>>> keep_most_relevant(d2)
>>> pprint.pprint(d2)
{'local': {'activities-events': {'count': 6,
                                 'life-skill-classes': {'count': 2},
                                 'outdoor-adventures': {'count': 4}},
           'count': 11,
           'dining-and-nightlife': {'bar-clubs': {'count': 4}, 'count': 4}}}

07-24 15:34