【问题标题】:Find similar items in list of dictionaries based on values根据值在字典列表中查找相似项目
【发布时间】:2019-01-03 14:25:07
【问题描述】:

我想根据存储在字典列表中的标签匹配来自 django 数据库的类似文章,如下所示:

myarticle = {'pk': 17, 'tags': [0, 1, 0, 1, 0]}
allarticles = [{'pk': 1, 'tags': [0, 0, 0, 1, 0]}, 
               {'pk': 2, 'tags': [0, 1, 0, 1, 0]},
               {'pk': 3, 'tags': [1, 1, 0, 0, 0]},
               {'pk': 4, 'tags': [1, 0, 1, 0, 1]},
               {'pk': 5, 'tags': [0, 0, 0, 0, 1]}]

根据输入的 myarticle 对匹配标签的数量进行排名的最方便的方法是什么?预期结果:

result = [2, 1, 3, 5, 4]

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask

标签: python list dictionary filtering similarity


【解决方案1】:

您可以通过numpy.argsort 将第 3 方 NumPy 用于矢量化解决方案。

对于更大的输入列表,这应该更有效:

allarticles = allarticles*10000

import numpy as np

def jp(myarticle, allarticles):
    arr = np.argsort((np.array([d['tags'] for d in allarticles]) == myarticle['tags']).sum(1))[::-1]
    return [allarticles[i]['pk'] for i in arr]

def ajax(myarticle, allarticles):
    new_articles = sorted(allarticles, key=lambda x:sum(a == b for a, b in zip(myarticle['tags'], x['tags'])), reverse=True)
    return [i['pk'] for i in new_articles]

%timeit jp(myarticle, allarticles)    # 49.3 ms per loop
%timeit ajax(myarticle, allarticles)  # 112 ms per loop

【讨论】:

    【解决方案2】:

    你可以使用sorted:

    myarticle = {'pk': 17, 'tags': [0, 1, 0, 1, 0]}
    allarticles = [{'pk': 1, 'tags': [0, 0, 0, 1, 0]}, 
               {'pk': 2, 'tags': [0, 1, 0, 1, 0]},
               {'pk': 3, 'tags': [1, 1, 0, 0, 0]},
               {'pk': 4, 'tags': [1, 0, 1, 0, 1]},
               {'pk': 5, 'tags': [0, 0, 0, 0, 1]}]
    new_articles = sorted(allarticles, key=lambda x:sum(a == b for a, b in zip(myarticle['tags'], x['tags'])), reverse=True)
    final_results = [i['pk'] for i in new_articles]
    

    输出:

    [2, 1, 3, 5, 4]
    

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 1970-01-01
      • 2013-02-12
      • 2021-08-24
      • 2018-08-31
      • 2016-03-14
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多