如何在python中对已排序的字符串元素列表应用二进制搜索?

如何在python中对已排序的字符串元素列表应用二进制搜索?,python,django,binary-search,Python,Django,Binary Search,我有一个字符串元素(城市名称)的排序列表,我想在此基础上实现二进制搜索,并通过给出首字母过滤掉城市 例如,用户输入: 所以在这里,我需要找出从纽约开始的城市 样本输出: [ "New Abbey|Ceredigion|United Kingdom", "New Albany|Indiana|United States", "New Albany|Kansas|United States", "New Albany|Mississippi|United States", "New Albany|O

我有一个字符串元素(城市名称)的排序列表,我想在此基础上实现二进制搜索,并通过给出首字母过滤掉城市

例如,用户输入:

所以在这里,我需要找出从纽约开始的城市

样本输出:

[
"New Abbey|Ceredigion|United Kingdom",
"New Albany|Indiana|United States",
"New Albany|Kansas|United States",
"New Albany|Mississippi|United States",
"New Albany|Ohio|United States"
]
请告知。

您可以使用来筛选所需的项目:

[x for x in cities if x.startswith('New')]

如果您希望在python中实现二进制搜索,那么这可能会对您有所帮助

def binarySearch(alist, item):
    first = 0
    last = len(alist)-1
    found = False

    while first<=last and not found:
         midpoint = (first + last)//2
         if alist[midpoint] == item:
             found = True
         else:
             if item < alist[midpoint]:
                 last = midpoint-1
             else:
                 first = midpoint+1

    return found

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binarySearch(testlist, 3))    
print(binarySearch(testlist, 13))
def二进制搜索(列表,项目):
第一个=0
last=len(alist)-1
发现=错误

首先,以下方法应该有效。它使用Python自己的名为
bisect
的二进制搜索库来查找列表中的初始索引。对于搜索词
New
,它返回2作为我的示例列表
itertools.takewhile
可用于返回条目,直到搜索词失败:

import bisect, itertools

locations = [
    "Aaaa|aaaa|Test",
    "Bbbb|bbbb|Test",
    "New Abbey|Ceredigion|United Kingdom",
    "New Albany|Indiana|United States",
    "New Albany|Kansas|United States",
    "New Albany|Mississippi|United States",
    "New Albany|Ohio|United States",
    "Zzzz|zzzz|Test"
    ]

search = "New"
start_index = bisect.bisect_left(locations, search)
print list(itertools.takewhile(lambda x: x.startswith(search), itertools.islice(locations, start_index, None)))
给出以下输出:

['New Abbey|Ceredigion|United Kingdom', 'New Albany|Indiana|United States', 'New Albany|Kansas|United States', 'New Albany|Mississippi|United States', 'New Albany|Ohio|United States']

我已经这么做了,但是我的老板要我实现二进制搜索。这是不可理解的。请不要在评论中转储代码。您曾问过如何查找以“新”开头的城市,答案就是这样。现在你在问-这是一件非常不同的事情-我想你的老板可能会困惑我已经给了他两种解决方案,一种是使用列表理解,另一种是借助正则表达式,但他说在这方面实现二进制搜索将减少搜索时间。目前这是一种迭代搜索,若我们实现二进制搜索,那个么搜索城市的时间就会减少。。。大概为了更好地利用您的时间,您需要一个真正的城市列表。我认为该链接应该是一个输入示例-看起来OP的代码从urlimport对分-->中提取了“新的”>请看这里:)非常感谢Martin:)