在列表列表中搜索郊区

时间:2017-05-02 09:37:17

标签: python search binary binary-search

我有一个列表列表,其中包含一组邮政编码和匹配的郊区。我需要创建一个迭代二进制搜索算法,要求用户输入郊区的名称,然后程序输出郊区所属的邮政编码。该列表如下所示:

L = [['4000', 'Charlestown'], ['4001', 'Jamestown'], ['4002', 'Henrytown']] 

因此,如果我对此运行二进制搜索并且用户输入“Jamestown”,则程序将输出“4001”。这就是我创建二进制搜索功能所做的:

    suburb = input("Please enter the name of a suburb: ")

    def binarySearch(L, target):
        low = 0
        high = len(L)-1
        while low <= high:
            mid = (low + high)//2
            if L[mid] == target:
                return mid
            elif L[mid] > target:
                high = mid-1
            else:
                low = mid+1
    binarySearch(L, suburb) 

然而,当我运行该程序时,我收到一个错误:

elif L[mid] > target:
     

TypeError:'&gt;' 'list'和'str'

的实例之间不受支持

我不确定如何解决这个问题,我们将非常感谢任何帮助。谢谢!

5 个答案:

答案 0 :(得分:1)

只需使用字典即可​​。让生活更轻松:

>>> d = {key: val for (val, key) in L}
>>> d['Jamestown']
'4001'

答案 1 :(得分:1)

对于这类问题,如果你可以将数据结构化为字典,那么你会变得更好,例如:

zips = { 'Charlestown': 4000, 'Jamestown': 4001,'Henrytown': 4002}

然后您可以一步查找任何郊区的邮政编码:

zips['Charlestown']

将评估为:

4000

如果你有一堆这些要查找,并且由于某种原因,数据是在列表中提供给你的,你可以从列表转换为字典。这个问题很好地解答了:

Convert a list to a dictionary in Python

如果您被迫使用奇怪的数据结构进行家庭作业练习,请参阅下面的单独答案。

答案 2 :(得分:1)

如果您真的开始使用列表,例如,如果这是用于作业......

认识到您正在使用列表列表。因此,当您尝试将第i个列表L [i]与郊区的值进行比较时,您将比较您的内部列表,例如[4000,'Charlestown']和'Charlestown'

相反,你会想要将L [i] [1]与郊区进行比较。

此外,根据您提供的数据,即使您修复了该功能,该功能也无法满足您的需求(尽管您将避免错误消息)。二进制搜索很棒,但它需要根据您要搜索的值对数据进行排序。

以下是对此的建议:

sorted(L, key=lambda L_inner: L_inner[1])

看看你是否可以弄清楚如何自己实现。一些文档:https://docs.python.org/3/howto/sorting.html#sortinghowto

答案 3 :(得分:0)

在这种情况下,您只需修改二进制搜索功能即可。错误是您将列表与字符串进行比较(请参阅异常消息)。那是因为这一行:

L[mid] > target

其中L [mid]是元组,target是String。请改用L[mid][1] > target

def binarySearch(L, target):
    low = 0
    high = len(L)-1
    while low <= high:
        mid = (low + high)//2
        if L[mid][1] == target:
            return mid
        elif L[mid][1] > target:
            high = mid-1
        else:
            low = mid+1

注意:仅当您的列表按照您的城镇名排序时才有效,否则您的搜索方向错误

答案 4 :(得分:0)

问题是你有一个多维数组,并且你试图将它与郊区的名称相匹配。您需要匹配每个嵌套数组的第二个元素。

   def binarySearch(L, target):
    low = 0
    high = len(L)-1
    while low <= high:
        mid = (low + high)/2
        if L[mid][1] == target:
            return L[mid][0]
        elif L[mid][1] > target:
            high = mid-1
        else:
            low = mid+1

请注意,我还会返回L [mid] [0],这会给你pincode而不是元素编号。