【问题标题】:How to implement binary search to find the index of an item which is inside a list of dictionaries如何实现二进制搜索以查找字典列表中的项目的索引
【发布时间】:2021-03-21 21:07:17
【问题描述】:

我有一个包含字典的列表:

base = [
    {"name": "Earth", "Density": 5.427},
    {"name": "Mars", "Density": 5.513},
    {"name": "Venus", "Density": 5.204},
]
name = input("What planet are you looking for? ")

该函数应返回项目的索引(在本例中为行星),如果不存在则返回 -1。

F.e | For input= Earth, expected output would be: 0
For input = venus, expected output: 2

binary search 是此任务的必备项。 我什至没有给你我的代码,因为它甚至不起作用。我知道二进制搜索是如何工作的,但不知道如何在字典列表中使用它。 PS。您不必编写整个代码,只需帮助我如何在字典列表中实现二元搜索。

【问题讨论】:

  • 该列表既没有按名称排序,也没有按密度排序。因此二进制搜索不适用于它。
  • 是的,我没有注意到。如果按名称排序怎么办? {“名称”:“地球”,“密度”:5.427},{“名称”:“火星”,“密度”:5.513},{“名称”:“金星”,“密度”:5.204},跨度>
  • 那么就可以对名称进行二分搜索(但不是密度)
  • 参见stackoverflow.com/questions/9501337/… 以了解实现(只是您将使用array[mid]["name"] 进行比较)。 stackoverflow.com/questions/212358/… 是内置解决方案,也可能适用。
  • 您说您没有显示您的代码,因为它不起作用,但这是人们在 Stack Overflow 上所做的,帮助修复损坏的代码 :) 所以请将其添加到您的问题中。

标签: python python-3.x dictionary binary-search


【解决方案1】:

对于二分搜索的每次迭代,它只是将您需要检查的项目数量减半,因此您是遍历树还是搜索列表并不重要。

如果要搜索的数据是简单整数、字典或复杂对象的列表,则无关紧要 - 如果您需要选择“左”或“右”部分下一个二进制印章。

在您的情况下,您将找到数组的中间索引,在该位置获取字典并将 name 属性与您要查找的内容进行比较。如果项目不匹配,则使用递归将列表的左半部分或右半部分传递给相同的搜索函数。

这是recursive binary search algorithm 的实现。

【讨论】:

    【解决方案2】:

    这将解决您的问题:

    for idx, value in enumerate(base):
        if value["name"] == name:
            print(idx + 1) # check this
            break
    

    但是,我想提醒您,python 中的索引从 0 开始,但是,对于地球,您已将 1 设置为值。所以你应该检查索引。

    将其转换为函数就像:

    def findPlanet(base, name):
        _idx = -1
        for idx, value in enumerate(base):
            if value["name"] == name:
                _idx = idx + 1
                break
            
        return _idx
    
    print(findPlanet(base, "Earth"))
    >> 1
    
    print(findPlanet(base, "None"))
    >> -1
    

    【讨论】:

    • 这是一个线性搜索。 OP 说二进制搜索是必须的。显然是某种任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多